【发布时间】:2018-07-30 19:52:32
【问题描述】:
我是 NodeJS 和 Promises 的新手,所以我可能不明白它是如何工作的。
我正在我的应用程序中加载一个配置文件,其特点是如果它不存在,我会使用来自数据库调用的信息来创建它。
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() 完成,所以它总是返回“找不到文件”。如果配置文件已经存在,则可以正常运行。
我尝试将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()的回调让你感到困惑。 -
fs.access是否返回承诺(提示:否)
标签: javascript node.js async-await es6-promise