使用node.js'util'进行承诺会返回错误

时间:2019-03-17 17:39:54

标签: node.js express

我正试图在文件中创建一个函数以返回一个Promis,我将其称为另一个文件。我正在尝试使用'util.promisify'包装函数,但出现错误。这是代码和错误:

来自我的“ checkEmail.js”:

const Profile = require('../../models/profile');
const util = require('util');


var exports = module.exports = {};

exports.findEmail = util.promisify(checkEmail());


 function checkEmail (email) {
   Profile.findOne({ 'emails': { $elemMatch: { email_address: email } } }, (err, userEmail) => {
    let conclusion = false;
    if (err) {
      console.log('Error in looking up an existing email');
    } else {
      if (userEmail) {
        console.log('We found an existing owner for email: ' + email);
        conclusion = true;
      }
    }
      return conclusion;
  })
 }

在“ profile.js”上调用它:

router.route('/addemail/:id')

  // ADD EMAILS
  .put(function (req, res) {


    Profile.findOne({ 'owner_id': req.params.id }, function (err, profile) {
      if (err)
        res.send(err);

      EmailCheck.findEmail(req.body.email_address).then((data)=>{ 
        console.log('The answer is: ', data);
      });

      profile.emails.push({
        email_type: req.body.email_type,
        email_address: req.body.email_address
      })
      profile.save(function (err) {
        if (err)
          res.send(err);
        res.json(profile);
      });
    });
  });

我得到的错误是:

Config for: http://localhost:3000
internal/util.js:272
    throw new ERR_INVALID_ARG_TYPE('original', 'Function', original);

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

为了使传递给util.promisify的功能合理化,必须:

  

采用遵循常见的错误优先回调样式的函数,即   将(err,value)=>回调作为最后一个参数 t,并返回一个返回诺言的版本

因此,您可以发送Profile.findOne,也可以将回调作为最后一个参数传递给checkEmail

function checkEmail (email, callback) {
   Profile.findOne({ 'emails': { $elemMatch: { email_address: email } } }, (err, userEmail) => {
    let conclusion = false;
    if (err)
      return callback(new Error('Error in looking up an existing email'));

    if (userEmail) {
      console.log('We found an existing owner for email: ' + email);
      conclusion = true;
    }
    return callback(null, conclusion);
  })
 }

然后您应该这样称呼它:

exports.findEmail = util.promisify(checkEmail);

否则,您会将.promisify的返回值传递给checkEmail,这不是遵循上述样式的函数。

答案 1 :(得分:0)

您有错字,请改用util.promisify(checkEmail),括号是多余的