使用数据库和服务器的承诺

即时通讯仍然在学习js,但即时通讯尝试在nodejs中编写一个基本的服务器。 服务器应该采取查询,然后从数据库返回一个JSON。

我试图使用承诺,但可以得到我的头。 我的服务器返回一个空的答复。 那么我做错了什么?

到目前为止我的服务器文件(简体):

http.createServer(function (request, response) { if (request.method === "GET") { ... var dbRes = dbFunc.getFromDB(query); response.statusCode = 200; response.setHeader('Content-Type', 'application/json'); response.end(JSON.stringify(dbRes)); } }).listen(port); 

我的数据库文件到目前为止(简体):

 exports.readHandeler = function (query) { var promise = new Promise(function(resolve, reject) { db.collection('data').find(query).toArray(function(err, res) { if (err) { throw err; reject(-1); } resolve(res); } }); promise.then(function(result) { return result; }, function(err) { return -1; }); } 

我的服务器返回一个空的答复。 那么我做错了什么?

由于您期待asynchronous承诺执行的响应,您的dbRes将是undefined 。 只有在承诺解决后您才需要发送回复。

对您的代码进行此更改

 http.createServer(function (request, response) { if (request.method === "GET") { ... dbFunc.getFromDB(query).then((dbRes) => { response.statusCode = 200; response.setHeader('Content-Type', 'application/json'); response.end(JSON.stringify(dbRes)); }).catch((err) => { console.log('err', err.stack); }); } }).listen(port); 

另外,你需要在数据库执行部分返回Promise。

 exports.readHandeler = function (query) { return new Promise(function (resolve, reject) { db.collection('data').find(query).toArray(function (err, result) { if (err) { return reject(err); // or -1 based on your need } return resolve(result); }); }); };