Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 蓝鸟。Promisify-如何创建一个正确的承诺链?_Node.js_Promise_Bluebird - Fatal编程技术网

Node.js 蓝鸟。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

这个问题紧跟着这个问题:

我决定使用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, 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我已根据您的要求更新了我的答案。过来看。