我正试图在文件中创建一个函数以返回一个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);
任何帮助将不胜感激。
答案 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)
,括号是多余的