возврат преобразователя graphql не может вернуть значение null для ненулевого поля из асинхронной функции в nodejs

#javascript #node.js #express #graphql #async.js

#javascript #node.js #выразить #graphql #async.js

Вопрос:

Не поймите меня неправильно, я был вынужден использовать водопад, потому что мне нужно выполнять одну функцию за другой. Нет никаких проблем, связанных со схемой или типом возвращаемого значения, просто застрявшим с асинхронным водопадом. Все, что мне нужно, это вернуться из конечной функции не раньше.

 const async = require('async')
module.exports = {
logout : ()=>{
        return async.waterfall([
            callback => {
                setTimeout(() => {
                    let data = 1;
                    return callback(null, data)
                }, 2000);
            },
            (data, callback) => {
                setTimeout(() => {
                    return callback(null, data 1)
                }, 2000);
            }
            
        ], (err, res)=>{
            console.log(res)
            return res
        })
    }
}
  

ответ от graphiql, потому что он возвращается раньше. И консоль.журнал работает

 {
  "errors": [
    {
      "message": "Cannot return null for non-nullable field RootMutation.logout.",
      "locations": [
        {
          "line": 4,
          "column": 3
        }
      ],
      "path": [
        "logout"
      ]
    }
  ],
  "data": null
}
  

Ответ №1:

Не могли бы вы использовать async / await здесь? В соответствии с приведенным ниже

 async function logout(){
       let data = await new Promise((resolve,reject) => {setTimeout(() => { resolve(1)},2000)});
       
         data = await new Promise((resolve,reject) => {setTimeout(() => { resolve(data   1)},2000)});
return data;
}

async function foo() {
    let res = await logout();
  alert(res)
}

foo()  

Также я не знаком с библиотекой async, но если вы действительно возвращаете async.waterfall() вызов в вашем примере, поскольку он возвращается undefined в соответствии с документами.

Возможно, просто

 const async = require('async')
module.exports = {
logout : ()=>{
        async.waterfall([
            callback => {
                setTimeout(() => {
                    let data = 1;
                    return callback(null, data)
                }, 2000);
            },
            (data, callback) => {
                setTimeout(() => {
                    return callback(null, data 1)
                }, 2000);
            }
            
        ], (err, res)=>{
            console.log(res)
            return res
        })
    }
}
  

Если нет, возможно, поделитесь, какую библиотеку GraphQL вы также используете