我正在使用Express将文件上传到我的后端,如下面的代码所示。一旦创建了它们,我想使用node来调用操纵该文件的shell脚本。上传的文件将是shell脚本(./script.sh文件)的参数,然后我想为该脚本返回stdout。我在努力的地方正在弄清楚将代码放置在哪里。应该在快速路由功能中还是在其下方?谁能告诉我该怎么做?
const multer = require('multer')
const fs = require('fs')
const exec = require('child_process').exec
const upload = multer({
dest: './upload',
fileFilter: function (req, file, cb) {
if (file.mimetype != 'application/vnd.openxmlformats-officedocument.wordprocessingml.document') {
return cb(new Error('Wrong file type'))
}
cb(null,true)
}
}).single('file');
app.post('/upload', upload, function(req, res) {
console.log(res);
};
答案 0 :(得分:0)
首先要警告一下,如果要接受用户输入并将其推入直接过程,尤其是在bash级别,则要非常小心。您最终可能会给某人很多访问您的服务器的权限!如果可以帮助的话,我通常建议不要这样做。现在已经解决了,让我们来谈谈Node。
如果这是一个快速过程,并且您想响应该过程是否成功,则可以将其放置在快速路由处理程序中。如果该进程长时间运行,则您可能希望立即做出响应,然后启动一个后台进程。这可以通过两种方式完成,一种是简单地启动异步过程而不等待其响应,另一种(也是更可靠的方式)是使用消息队列。将消息放入队列中,然后使工作进程从队列中消耗以处理作业。
如果您想直接执行此操作并使用shell进程的结果对其进行响应,那么您将执行以下操作。
app.post('/upload', upload, function(req, res) {
const filePath = upload.path; // This may be the incorrect way to grab the path
// Run the thing...
exec("script.sh " + filePath, function(err, stdout, stderr) {
// Handle errors and respond to the client...
res.sendStatus(200);
});
});
再次,我真的要敦促您考虑不要这样做,因为这会带来潜在的安全漏洞。很有可能,如果您可以在Shell脚本中执行此操作,则可能可以执行节点中所需的大部分操作,除非您要进行系统更改(这对安全性也是一个坏主意)。