我想将从json对象接收的文件保存在REST API应用中,这是代码:
router.post('/addphoto', checkAuth, (req, res)=> {
let filename = Math.floor(Math.random() * 100000);
let dir = './uploads/' + req.user.id;
//Not sure about this
if (!fs.existsSync(dir)){
fs.mkdirSync(dir);
}
base64String = req.body.file;
let base64Image = base64String.split(';base64,').pop();
let filePath = dir + "/" + filename
fs.writeFile( filePath, base64Image, {encoding: 'base64'}, function(err) {
console.log('File created');
});
...
它可以完成工作,但是我已经知道existsSync
已过时,而且我不确定在本质上异步的路由器中使用同步代码是否是个好主意。
所以我想知道在这种情况下惯用的方法是什么?
答案 0 :(得分:1)
您可以使用existsSync
,因为它已被弃用。 exists
已弃用。我已在下面附上了屏幕截图和链接,因此您可以毫无问题地使用它。
link->
https://nodejs.org/api/fs.html#fs_fs_existssync_path
图片->
答案 1 :(得分:1)
您可以使用访问权限
fs.access(myDir, function(err) {
if (err && err.code === 'ENOENT') {
fs.mkdir(myDir); //Create dir in case not found
}
});
答案 2 :(得分:1)
我已阅读过不推荐使用existSync
不是。参见the manual:
fs.exists()已弃用,但fs.existsSync()不是。 fs.exists()的回调参数接受与其他Node.js回调不一致的参数。 fs.existsSync()不使用回调。
我不确定在本质上异步的路由器中使用同步代码是否是个好主意。
在异步内部执行同步操作没有本质上的错误-最 JS是同步的-但这确实意味着该功能将在查看文件系统并查看事件时阻止事件循环文件系统上的操作比较耗时,因此对性能不利。
您的代码可能不需要那种性能,但这是我们无法为您做出的判断。
exists
就在手册中的existsSync
旁边,并说:
已弃用:请改用fs.stat()或fs.access()。
所以选择其中之一。
access
举例:
// Check if the file exists in the current directory. fs.access(file, fs.constants.F_OK, (err) => { console.log(`${file} ${err ? 'does not exist' : 'exists'}`); });
答案 3 :(得分:0)
如果您使用node-fs-extra,则可以使用...
fs.ensureDir(dir[,options][,callback])
根据定义...
确保目录存在。如果目录结构不存在,则会创建它。
另请参阅fs.ensureDirSync
答案 4 :(得分:0)
下面的代码将检查目的地是否存在。如果它不存在,它将创建目标作为目录。如果父目录不存在(因为 recursive: true
),它也会创建父目录。它不使用同步功能,如果在 Web 服务器中使用,也不会阻止请求。
const fs = require('fs');
const targetDirectory = 'your/path/here';
fs.mkdir(targetDirectory, { recursive: true }, (error) => {
if (!error) {
console.log('Directory successfully created, or it already exists.');
return;
}
switch (error.code) {
case 'EEXIST':
// Error:
// Requested location already exists, but it's not a directory.
break;
case 'ENOTDIR':
// Error:
// The parent hierarchy contains a file with the same name as the dir
// you're trying to create.
break;
default:
// Some other error like permission denied.
console.error(error);
break;
}
});
参见:mkdir docs。