Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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
Javascript NodeJS异步/等待订单不工作_Javascript_Node.js_Async Await_Es6 Promise - Fatal编程技术网

Javascript NodeJS异步/等待订单不工作

Javascript NodeJS异步/等待订单不工作,javascript,node.js,async-await,es6-promise,Javascript,Node.js,Async Await,Es6 Promise,我对NodeJS和承诺是新手,所以我可能不了解它是如何工作的 我正在我的应用程序中加载一个配置文件,其特点是,若它不存在,我将通过调用数据库来创建它 function getConfig(clientId, app) { return new Promise(async (resolve, reject) => { await fs.access(config.files.url_networks_file, async function(err) { if (er

我对NodeJS和承诺是新手,所以我可能不了解它是如何工作的

我正在我的应用程序中加载一个配置文件,其特点是,若它不存在,我将通过调用数据库来创建它

function getConfig(clientId, app) {
  return new Promise(async (resolve, reject) => {
    await fs.access(config.files.url_networks_file, async function(err) {
      if (err) {
        try {
          await loadClientConfig(clientId);
        } catch (e) {
          reject(e);
        }
      }
    });

    fs.readFile(config.files.url_networks_file, 'utf8', function(err, data) { // Try to read network's configuration file
      if (err) { // If file doesn't exists
        reject(err);
      } else if (JSON.parse(data)[app]) { // In case app's config exists
        resolve(JSON.parse(data)[app]);
      } else { // In case app's config doesn't exists
        reject(new Error('There\'s no configuration for app: ' + app));
      }
    });
  });
}
我的问题是
fs.readFile()
不会等到
loadClientConfig()
finish,所以它总是返回“file not found”。如果配置文件已经存在,那么它可以正常工作

我尝试将
fs.readFile()
放入
fs.access()
回调中,但仍然没有得到任何结果(即使文件存在)

更新

仍然无法使用我收到的两个解决方案。我正在发布我为每个人制作的代码,以检查我是否在编码中丢失了一些东西:

@昆廷

async function loadClientConfig(clientId) {
    return new Promise((resolve, reject) => {
        fs.access(config.files.url_networks_file, function (err) {
            if (err) {
                try {
                    sql.close();
                    sql.connect(config.database.credentials, function (err) {
                        if (err) {
                            reject(err);
                        } else {
                            var request = new sql.Request();
                            request.input('clientId', clientId);
                            query = config.database.queries.all;

                            request.query(query, function (e, data) {
                                if (e) {
                                    reject(e);
                                } else {
                                    try {
                                        resolve(writeConfigFile(data.recordset));
                                    } catch (err) {
                                        reject(err);
                                    }
                                }
                            });
                        }
                    });
                } catch (e) {
                    reject(e);
                }
            }
        });
    });
};

async function getConfig(clientId, app) {
  return new Promise(async (resolve, reject) => {
    try {
      await loadClientConfig(clientId);
    } catch (e) {
      reject(e);
    }

    fs.readFile(config.files.url_networks_file, 'utf8', function(err, data) { // Try to read network's configuration file
      if (err) { // If file doesn't exists
        reject(err);
      } else if (JSON.parse(data)[app]) { // In case app's config exists
        resolve(JSON.parse(data)[app]);
      } else { // In case app's config doesn't exists
        reject(new Error('There\'s no configuration for app: ' + app));
      }
    });
  });
}
@dasfdsa

async function loadClientConfig(clientId) {
  return new Promise((resolve, reject) => {
    sql.close();
    sql.connect(config.database.credentials, function(err) {
      if (err) {
        reject(err);
      } else {
        var request = new sql.Request();
        request.input('clientId', clientId);
        query = config.database.queries.all;

        request.query(query, async function(e, data) {
          if (e) {
            reject(e);
          } else {              
            try {
              resolve(writeConfigFile(data.recordset));
            } catch (err) {
              reject(err);
            }
          }
        });
      }
    });
  });
};

async function getConfig(clientId, app) {
  await new Promise((resolve, reject) => {
    fs.access(config.files.url_networks_file, async function (err) {
      if (err) {
        try {
          let temp = await loadClientConfig(clientId); /*Now that you told me its async, we will await it as well*/
          resolve(temp);
        } catch (e) {
          reject(e);
        }
      } else {
        resolve();
      }
    });
  });
  let configuration = await new Promise((resolve, reject) => {
    fs.readFile(config.files.url_networks_file, 'utf8', function (err, data) { // Try to read network's configuration file
      if (err) { // If file doesn't exists
        reject(err);
      } else if (JSON.parse(data)[app]) { // In case app's config exists
        resolve(JSON.parse(data)[app]);
      } else { // In case app's config doesn't exists
        reject(new Error('There\'s no configuration for app: ' + app));
      }
    });
  });

  return configuration;
}
更新2


这似乎在调试时起作用,我使用的是VSCode。我认为这可能是超时问题或类似问题。

你只能等待承诺


fs.access
不返回承诺(它需要回调)。(由于问题中未包含该函数,因此无法说明
loadClientConfig
的作用)


如果您想
等待它,那么您需要将它包装在一个函数中,该函数返回一个承诺。

您只能
等待一个承诺


fs.access
不返回承诺(它需要回调)。(由于问题中未包含该函数,因此无法说明
loadClientConfig
的作用)


如果您想等待它,那么您需要将它包装在一个函数中,该函数返回一个承诺。

代码:对于每个回调,两个独立的
等待的
承诺
getConfig
返回将解析为
config
promise

async function getConfig(clientId, app) {
    await new Promise((resolve, reject) => {
        fs.access(config.files.url_networks_file, async function (err) {
            if (err) {
                try {
                    let temp = await loadClientConfig(clientId);/*Now that you told me its async, we will await it as well*/
                    resolve(temp);
                } catch (e) {
                    reject(e);
                }
            }
        });
    });
    let config = await new Promise((resolve, reject) => {
        fs.readFile(config.files.url_networks_file, 'utf8', function (err, data) { // Try to read network's configuration file
            if (err) { // If file doesn't exists
                reject(err);
            } else if (JSON.parse(data)[app]) { // In case app's config exists
                resolve(JSON.parse(data)[app]);
            } else { // In case app's config doesn't exists
                reject(new Error('There\'s no configuration for app: ' + app));
            }
        });
    });

    return config;

}

编辑:我已经编辑了等待
loadClientConfig()
,如果
loadClientConfig
返回承诺,上述代码应该可以正常工作。

代码:对于每个回调,两个独立的
等待
承诺
getConfig
返回将解析为
config
promise

async function getConfig(clientId, app) {
    await new Promise((resolve, reject) => {
        fs.access(config.files.url_networks_file, async function (err) {
            if (err) {
                try {
                    let temp = await loadClientConfig(clientId);/*Now that you told me its async, we will await it as well*/
                    resolve(temp);
                } catch (e) {
                    reject(e);
                }
            }
        });
    });
    let config = await new Promise((resolve, reject) => {
        fs.readFile(config.files.url_networks_file, 'utf8', function (err, data) { // Try to read network's configuration file
            if (err) { // If file doesn't exists
                reject(err);
            } else if (JSON.parse(data)[app]) { // In case app's config exists
                resolve(JSON.parse(data)[app]);
            } else { // In case app's config doesn't exists
                reject(new Error('There\'s no configuration for app: ' + app));
            }
        });
    });

    return config;

}


编辑:我已编辑等待
loadClientConfig()
,如果
loadClientConfig
返回承诺,上述代码应该可以正常工作。

传递给
fs.access()
的回调会绊倒你。does
fs.access
返回承诺(提示:否)传递给
fs.access()的回调
正在绊倒你。是否
fs.access
返回承诺(提示:否)我已尝试移动
fs.access
,但仍然无法工作:
等待loadClientConfig(clientId)
fs.readFile(config.files.url_networks_file,'utf8',function(err,data){//尝试读取网络的配置文件
`if(err){//if文件不存在``拒绝(err);`}else if(JSON.parse(data)[app]){//如果app的配置存在``解析(JSON.parse(data)[app].`}else{//如果应用程序的配置不存在``拒绝(新错误('app:'+app'没有配置));``}“@AndrésMarotta-我说过你需要用一个承诺来包装fs.access,但你没有。
loadClientConfig
是一个返回承诺的函数,不是你让我这么做的吗?我几乎用我所有的函数来做,而且工作很好,总是有一个try-catch块。@AndrésMarotta-你想要
fs.readFile
等到
fs.access
已完成。
fs.access
不会返回承诺。我将发布解决方案,以便更容易查看。我已尝试移动
fs.access
,但仍然无法工作:
等待loadClientConfig(clientId);
fs.readFile(config.files.url\u networks\u file,'utf8',函数(err,data){//尝试读取网络的配置文件
`if(err){//if文件不存在``拒绝(err);`}否则if(JSON.parse(data)[app]){//如果app的配置存在``解析(JSON.parse(data)[app]);``}否则{//如果app的配置不存在``拒绝(新错误('app:'+app'没有配置];`}})“@AndrésMarotta-我说过你需要用一个承诺来包装fs.access,但你没有。
loadClientConfig
是一个返回承诺的函数,不是你让我这么做的吗?我几乎用我所有的函数来做,而且工作很好,总是有一个try-catch块。@AndrésMarotta-你想要
fs.readFile
等到
fs.access
已完成。
fs.access
不会返回承诺。我将发布解决方案,以便于查看。感谢您的评论。我将删除它。如果
loadClientConfig(clientId)中有任何错误
它将转到下一个catch块,承诺将被拒绝。
loadClientConfig
是一个异步函数吗?是的,它是一个异步函数。我没有收到任何错误,即使在控制台中也没有。如果我编码错误,我可以用gaven解决方案更新我的答案。它会返回承诺吗?如果是,我现在编辑的代码会正常工作。我尝试了您的解决方案进行了一些小的修改,最终使其正常工作。原来问题是
nodemon
,我不知道为什么,但使用
node
或甚至使用de-VS-code启动服务器,效果很好!谢谢!谢谢您的评论。我将删除它。如果
loadClientConfig(clientId)中有任何错误
它将转到下一个catch块,承诺将被拒绝。
loadClientConfig
是一个异步函数吗?是的,它是一个异步函数。我没有收到任何错误,即使在控制台中也没有。如果我编码错误,我可以用gaven解决方案更新我的答案。它会返回承诺吗?如果是,我现在编辑的代码会正常工作。我尝试了您的解决方案只需稍作修改