我是JS新手,所以这可能有些愚蠢。我有一个用NodeJS 10.x编写的lambda,并且试图添加MongoDB Atlas插入。我已经从本教程开始:https://docs.atlas.mongodb.com/best-practices-connecting-to-aws-lambda/
这是我的代码:
const MongoClient = require('mongodb').MongoClient;
let cachedDb = null;
function connectToDatabase (uri) {
console.log('Connect to mongo database');
if (cachedDb) {
console.log('Using cached database instance');
return Promise.resolve(cachedDb);
}
return MongoClient.connect(uri)
.then(db => {
console.log('Successful connect');
cachedDb = db;
return cachedDb;
}).catch(err => {
console.log('Connection error occurred: ', err);
callback(err);
});
}
function insertUser(db, email) {
console.log('=> modify database');
return db.collection('users').insertOne({"email" : email})
.then(() => { callback(null, result); })
.catch(err => {
console.log('Insert error occurred: ', err);
callback(err);
});
}
exports.handler = (payload, context, callback) => {
const { email, password } = JSON.parse(payload.body);
context.callbackWaitsForEmptyEventLoop = false;
connectToDatabase(MONGODB_URI)
.then(db => {
console.log('Mongo connected')
insertUser(db, email);
})
.then(result => {
console.log('Mongo insert succeeded', result);
})
.catch(err => {
console.log('Mongo insert failed', err);
return responses.INTERNAL_SERVER_ERROR_500(err, callback, response);
});
console.log('finished mongo stuff');
我可以在CloudWatch中看到以下日志:
START RequestId: 0338d336-7d33-40d5-abc7-1511f1c9ea4c Version: $LATEST
2020-01-11T12:18:00.808Z 0338d336-7d33-40d5-abc7-1511f1c9ea4c INFO Connect to mongo database
2020-01-11T12:18:00.855Z 0338d336-7d33-40d5-abc7-1511f1c9ea4c INFO finished mongo stuff
2020-01-11T12:18:01.416Z 0338d336-7d33-40d5-abc7-1511f1c9ea4c ERROR (node:8) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
END RequestId: 0338d336-7d33-40d5-abc7-1511f1c9ea4c
该项目未插入地图集。我添加了更多详细的日志记录,但未显示。如果mongo连接失败,将出现错误。但是似乎错误处理程序被忽略了。问题出在哪里?
您非常亲密。缺少一些东西
.then
且使用花括号时,您需要返回其中的任何内容以将其发送到下一个(除非您在一行中执行此操作)。我已经为此修改了代码。希望它能工作
const MongoClient = require("mongodb").MongoClient;
let cachedDb = null;
function connectToDatabase(uri) {
console.log("Connect to mongo database");
if (cachedDb) {
console.log("Using cached database instance");
return Promise.resolve(cachedDb);
}
return MongoClient.connect(uri)
.then(db => {
console.log("Successful connect");
cachedDb = db;
return cachedDb;
})
.catch(err => {
console.log("Connection error occurred: ", err);
});
}
function insertUser(db, email) {
console.log("=> modify database");
return db
.collection("users")
.insertOne({ email: email })
.catch(err => {
console.log("Insert error occurred: ", err);
callback(err);
});
}
exports.handler = (payload, context, callback) => {
const { email, password } = JSON.parse(payload.body);
context.callbackWaitsForEmptyEventLoop = false;
connectToDatabase(MONGODB_URI)
.then(db => {
console.log("Mongo connected");
return insertUser(db, email);
})
.then(result => {
console.log("Mongo insert succeeded", result);
callback(null, result);
})
.catch(err => {
console.log("Mongo insert failed", err);
callback(err, null);
return responses.INTERNAL_SERVER_ERROR_500(err, callback, response);
});
};
顺便说一句,您可以使用async/await
而不是回调样式来使其变得简单。如果您决定使用它,请使用等效代码
exports.handler = async (payload) => {
try {
const { email, password } = JSON.parse(payload.body);
const db = await connectToDatabase(MONGODB_URI);
console.log("Mongo connected");
const result = await insertUser(db, email);
console.log("Mongo insert succeeded", result);
return result;
} catch(err) {
console.error(err);
}
};