Javascript Node js调用3个函数,具体取决于前面的
嘿,伙计们,这是一个express应用程序,它通过Post获取一个文件,然后保存它,发送到另一个服务器,然后删除它。整个过程都是有效的,但是如果我记录程序产生的步骤,我会感到困惑,因为我甚至在保存文件之前就得到了要删除的输出。所以现在我想知道是否有可能一步一步地调用这3个函数。因为在保存文件之前删除它是不正确的。这是我的代码,希望你能帮助我Javascript Node js调用3个函数,具体取决于前面的,javascript,node.js,Javascript,Node.js,嘿,伙计们,这是一个express应用程序,它通过Post获取一个文件,然后保存它,发送到另一个服务器,然后删除它。整个过程都是有效的,但是如果我记录程序产生的步骤,我会感到困惑,因为我甚至在保存文件之前就得到了要删除的输出。所以现在我想知道是否有可能一步一步地调用这3个函数。因为在保存文件之前删除它是不正确的。这是我的代码,希望你能帮助我 server.post("/upload", function (req, res) { if (!req.files) { res
server.post("/upload", function (req, res) {
if (!req.files) {
res.send("No file uploaded");
} else {
//the Filepointer points to the whole File object which can contain multiple files
var filePointer = req.files;
console.log(filePointer);
res.send("Files uploaded");
let key;
for (key of Object.keys(filePointer)) {
//single file uploaded so no json Object else get number of elements in the Array and loop over them
if ((typeof filePointer[key][0]) === 'undefined') {
//if theres only one File in the Object you can directly access the keys
var file = filePointer[key];
//console.log("var is undefined");
console.log(file["name"]);
var uploadPath = __dirname + "/uploads/" + file["name"];
console.log(uploadPath);
saveFile(uploadPath, file);
sendToTika();
deleteFile(uploadPath);
} else {
let index;
for (index of Object.keys(filePointer[key])) {
//with multiple files you need to access the keys with an indey i
var file = filePointer[key][index];
console.log(file["name"]);
var uploadPath = __dirname + "/uploads/" + file["name"];
console.log(uploadPath);
saveFile(uploadPath, file);
sendToTika();
deleteFile(uploadPath);
}
}
}
}
});
server.listen(3000, function () {
console.log("server is listening on port 3000");
})
function saveFile(UploadPath, file) {
file.mv(UploadPath, function (err) {
if (err) {
console.log(err);
} else {
console.log("file uploaded and saved" + UploadPath);
}
})
}
function sendToTika() {
console.log("tika Function");
}
//TODO: check if sync or async is better for this task
function deleteFile(deletePath) {
fs.unlink(deletePath, function (error) {
if (error) {
console.log(error);
}
console.log("deleted" + deletePath);
})
}
控制台日志为:
tika Function
deleted
file uploaded and saved
编辑:嘿,伙计们,首先谢谢你们的回答,我来看看承诺 问题在于函数
saveFile
和deleteFile
使用异步函数(回调),您可以使用Promise
:
function saveFile(UploadPath, file) {
return new Promise(function(resolve, reject) {
file.mv(UploadPath, function (err) {
if (err) {
reject(err);
console.log(err);
} else {
resolve();
console.log("file uploaded and saved" + UploadPath);
}
});
});
}
function deleteFile(deletePath) {
return new Promise(function (resolve, reject) {
fs.unlink(deletePath, function (error) {
if (error) {
reject(error);
console.log(error);
}
else {
resolve();
console.log("deleted" + deletePath);
}
});
});
}
对sendToTika
函数使用相同的逻辑,并按如下方式调用该函数:
saveFile(uploadPath, file).then(() => {
return sendToTika();
}).then(() => {
return deleteFile(uploadPath);
}).catch((err) => {
// get the error here
})
您还可以使用函数util.promisify
返回返回承诺的函数版本:试试这个
function saveFile(UploadPath, file) {
return new Promise(function(resolve, reject) {
file.mv(UploadPath, function (err) {
if (err) {
reject(err);
console.log(err);
} else {
resolve(true);
console.log("file uploaded and saved" + UploadPath);
}
});
});
}
function deleteFile(deletePath) {
return new Promise(function (resolve, reject) {
fs.unlink(deletePath, function (error) {
if (error) {
reject(error);
console.log(error);
}
else {
resolve(true);
console.log("deleted" + deletePath);
}
});
});
}
最后,
router.post('/upload', function(req, response){
saveFile(uploadPath, file).then((status) => {
if(status){
sendToTika().then((result) => {
if(result){
deleteFile(uploadPath);
response.send({"status": true, "error": ''}) ;
}
else
response.sendStatus(203);
}).catch((err) => {
response.sendStatus(203);
})
}
else
response.sendStatus(203);
}).catch((err) => {
response.sendStatus(203);
})
});
我希望这对您有所帮助。使用承诺是可能的,因为这些函数是异步的。看看这里:您应该阅读Javascript中的异步编程。您的
saveFile
方法调用file.mv
并立即返回。。。稍后,异步文件移动完成后,将触发您传递的函数(该函数记录“文件上载和保存”)。。。可能在fs.取消链接
已完成并运行其callback@Henry在这种情况下,你没有等待或你没有使用任何承诺。如果将promise与回调一起使用,则可以实现这一点。在这种情况下,如果sendToTika方法失败,会发生什么?它仍然会调用deleteFile方法,这在他的代码中是错误的。sendToTika函数只调用console.log,但他可以在这个函数中使用promise。我已经编辑了我的答案。据我所知,你的答案和期望的答案仍然有一点冲突。请再次阅读问题并根据其回答。谢谢你的答案结构更好,这就是为什么我在后面的问题中为运行此问题的人勾选了正确的答案。通过你这样的代码,我得到了错误(节点:5735)未处理的PromisejectionWarning:未处理的承诺拒绝(拒绝id:1):错误:发送后无法设置头。(节点:5735)[DEP0018]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程。它是否与我正在使用的软件包相关联,因为它已经在使用承诺(请看:),所以我想我已经发现了。问题是我之前已经发送了响应。我还需要为Tika函数添加承诺。我将张贴最后的代码时完成这一点。