Node.js 蓝鸟。Promisify-如何创建一个正确的承诺链?
这个问题紧跟着这个问题: 我决定使用Bluebird.promisify编写上一个问题中的代码。这是我写的:Node.js 蓝鸟。Promisify-如何创建一个正确的承诺链?,node.js,promise,bluebird,Node.js,Promise,Bluebird,这个问题紧跟着这个问题: 我决定使用Bluebird.promisify编写上一个问题中的代码。这是我写的: var express = require('express') var app = express() var MongoClient = require('mongodb').MongoClient; var db = require('./db.js') var Promise = require('bluebird'); app.get('/', function(req, r
var express = require('express')
var app = express()
var MongoClient = require('mongodb').MongoClient;
var db = require('./db.js')
var Promise = require('bluebird');
app.get('/', function(req, res){
var result = Promise.promisify(db.get_document);
result().then(function(doc) {
res.send(doc);
console.log("end");
});
});
app.listen(3000, function(req, res) {
console.log("Listening on port 3000");
});
function get_document () {
var connect = Promise.promisify(MongoClient.connect);
connect(url).then(function(err,db) {
var col = db.collection('myinterviews'); // !!! ERROR!!! 'db' undefined
return col.find().toArray
}).then(function (err, docs) {
db.close();
return docs[0].name;
});
};
该行:
var col=db.collection('我的采访')
给出错误消息:
“未处理的拒绝类型错误:无法读取的属性‘集合’。”
未定义。”
函数MongoClient.connect接受带有两个参数的回调函数,那么为什么“db”未定义呢 Promise不会将错误和结果传递给相同的方法。您必须添加
catch
才能获得错误
另外,您提出的方法接受回调并调用它,第一个参数作为错误,另一个作为结果
var express = require('express')
var app = express()
var MongoClient = require('mongodb').MongoClient;
var Promise = require('bluebird');
app.get('/', function(req, res){
var result = Promise.promisify(get_document);
result().then(function(doc) {
res.send(doc);
console.log("end");
}).catch(function(err){
console.log(err);
res.status(500).send(err.toString());
});
});
app.listen(3000, function(req, res) {
console.log("Listening on port 3000");
});
function get_document (callback) {
return Promise.promisify(MongoClient.connect)(YOUR_URL)
.then(function(db){
return db.collection(YOUR_COLLECTION).find().toArray();
})
.then(function (docs) {
return callback(null, docs[0].name);
}).catch(function(err){
return callback(err);
});
};
承诺不会将错误和结果传递给相同的方法。您必须添加
catch
才能获得错误
另外,您提出的方法接受回调并调用它,第一个参数作为错误,另一个作为结果
var express = require('express')
var app = express()
var MongoClient = require('mongodb').MongoClient;
var Promise = require('bluebird');
app.get('/', function(req, res){
var result = Promise.promisify(get_document);
result().then(function(doc) {
res.send(doc);
console.log("end");
}).catch(function(err){
console.log(err);
res.status(500).send(err.toString());
});
});
app.listen(3000, function(req, res) {
console.log("Listening on port 3000");
});
function get_document (callback) {
return Promise.promisify(MongoClient.connect)(YOUR_URL)
.then(function(db){
return db.collection(YOUR_COLLECTION).find().toArray();
})
.then(function (docs) {
return callback(null, docs[0].name);
}).catch(function(err){
return callback(err);
});
};
我没有看到MongoClient在任何地方定义,这可能是个问题。url定义在哪里。我复制代码时没有找到它。我编辑了原始帖子。你在哪里调用
get\u document
?我看不到MongoClient在哪里定义,这可能就是问题所在。url定义在哪里。我复制代码时没有找到它。我编辑了原始帖子。你甚至在哪里调用get_document
?现在,我得到一个“db.close()”错误,说:“db未定义”,这是因为第二个函数中不存在db。这是js 101.OK。因此,当我删除“db.close”行时,docs[0]。名称不会传输到res.send(doc)。您不应该关闭连接。为你的应用创建连接,而不是请求。MongoClient将负责连接。@CrazySynthax我已根据您的要求更新了我的答案。现在,我在“db.close()”中得到一个错误,它说:“db未定义”,这是因为第二个函数中不存在db。这是js 101.OK。因此,当我删除“db.close”行时,docs[0]。名称不会传输到res.send(doc)。您不应该关闭连接。为你的应用创建连接,而不是请求。MongoClient将负责连接。@CrazySynthax我已根据您的要求更新了我的答案。过来看。