Использование node.js 'util' для обещания возвращает ошибку - PullRequest
1 голос
/ 17 марта 2019

Я пытаюсь создать функцию в файле, чтобы вернуть обещание, которое я назову из другого файла.Я пытаюсь использовать «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 ]

3 голосов
/ 17 марта 2019

Чтобы обещать функцию, которую вы передаете 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, которое не является функцией, следуя стилю, приведенному выше.

0 голосов
/ 17 марта 2019

У вас есть опечатка, вместо нее используйте util.promisify(checkEmail), круглые скобки избыточны

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...