【问题标题】:How to resolve path issues while moving files in node.js?在 node.js 中移动文件时如何解决路径问题?
【发布时间】:2020-12-07 06:08:06
【问题描述】:

我正在尝试从 html 表单中获取文件并将其存储在另一个文件夹中。它基本上是云功能,我对 node.js 和 firebase 都是新手,所以不知道我做错了什么。我设法做的是:

const fileMiddleware = require('express-multipart-file-parser');

app.post("/sendMail", (req, res) => {
const {
    fieldname,
    filename,
    encoding,
    mimetype,
    buffer,
  } = req.files[0];
  console.log(req.files[0].originalname);
  var fs = require('fs')

  var oldPath = req.files[0].originalname;
  var newPath = '/functions/'+oldPath;

  fs.rename(oldPath, newPath, function (err) {
      if (err) throw err
      console.log('Successfully renamed - AKA moved!')
  });
});

每当我尝试移动文件时,都会遇到路径问题。错误如下:

[Error: ENOENT: no such file or directory, rename 'C:\Users\Maisum Abbas\now\functions\sendMail.txt' 
> 'C:\functions\sendMail.txt'] {    
>    errno: -4058,
>    code: 'ENOENT',
>    syscall: 'rename',
>    path: 'C:\\Users\\Maisum Abbas\\now\\functions\\sendMail.txt',
>    dest: 'C:\\functions\\sendMail.txt'
>  }

另外,这是我想要实际移动文件的路径,但 oldpath 已经像这样设置了。

C:\Users\Maisum Abbas\now\functions\sendMail.txt 

【问题讨论】:

    标签: javascript node.js express google-cloud-functions


    【解决方案1】:

    由于我需要通过电子邮件附加文件,因此会导致路径问题。我用 multer 试了一下,效果很好。我做了什么:

    //call libraries here
    
    var storage =   multer.diskStorage({
        destination: function (req, file, callback) {
        callback(null, 'resume/');
      },
      filename: function (req, file, callback) {
        callback(null, file.fieldname + '-' + Date.now());
      }
    });
    
    var upload = multer({ storage : storage}).single('filetoupload');
    
    app.post("/careerMail", (req, res) => {
      const { name } = req.body;
      const { email } = req.body;
      const { phone } = req.body;
      upload(req,res,function(err) {
        if(err) {
            return res.end("Error uploading file.");
        }
      });
    
    const dest = 'mymail';
    
    const mailOptions = {
        from: email, // Something like: Jane Doe <janedoe@gmail.com>
        to: dest,
        subject: 'Candidate Application', // email subject
        html: `<div>             
        <strong>From:</strong> ` +
              name +
              `<br /><br />              
        <strong>Email:</strong> ` +
              email +
              `<br /><br />              
        <strong>Phone:</strong> ` +
              phone +
              `<br /><br />           
        </div>           
        `,// email content in HTML
        attachments: [
          {
              filename: req.files[0].originalname,
              content: req.files[0].buffer.toString("base64"),
              encoding: "base64"
          }
        ]
    
    and rest of the code...
    

    【讨论】:

      【解决方案2】:

      我建议完全重新考虑这种方法。您将无法在已部署的函数中移动文件。 nodejs runtime filesystem 不允许将任何文件写入文件系统中的任何位置,os.tmpdir() 除外(在 Linux 上是 /tmp)。

      如果你需要临时写一个文件,你绝对应该只使用那个 tmp 空间。请注意,写入那里的文件会占用内存,应在函数终止之前将其删除,否则可能会泄漏内存。

      您可以读取使用代码部署的文件,但您应该通过相对路径来读取。

      【讨论】:

      • 我只需要文件将其作为附件附加并发送电子邮件,因为我只需要正确的路径,如果我能够做到这一点,那么我不必移动文件。但是,由于某种原因,它只检查我的 index.js 所在的文件路径,这就是我试图移动它的原因。但是,如果有什么方法可以在不移动文件的情况下完成,请告诉我。我浏览了各种帖子,但没有什么对我有用,或者我可能无法正确完成。
      • 如果您知道附件名称,您可以获取根路径,然后连接位置,例如 ```filePath = rootPath + '/foldernames/+fileName;
      【解决方案3】:

      我在移动文件时遇到了同样的问题。我通过使用一个函数来获取应用程序根文件夹,然后连接该位置的其余部分来对这个问题进行排序。

      //place this file on application root.
      //import where you need to get the root path.
      
      const path = require('path');
      module.exports = (function(){
          return path.dirname(require.main.filename || process.mainModule.filename);
      })();
      
      //taking your case move location.
      
      const rootPath = //require the above module.
      
      const newPath = rootPath + /functions/' +oldPath;
      
       fs.rename(oldPath, newPath, function (err) {
            if (err) throw err
            console.log('Successfully renamed - AKA moved!')
        });
      
      

      【讨论】:

      • 部署后会不会产生问题,因为根路径将在您的系统上?另外,如果您从其他路径上传文件,这是否也会产生问题,只是一个想法?我对 node.js 完全陌生,所以不能说我是否有意义。
      • 这不会在服务器上产生任何问题。如果您想从其他目录上传文件,只需连接 newPath = rootPath + folderWhereToUpload+whateverFileNameYouWant;
      • 你能告诉我你是如何导入你的根路径的吗?
      • 在项目根目录上创建一个文件并将其命名为 root.js,然后粘贴 const path = require('path'); module.exports = (function(){ return path.dirname(require.main.filename || process.mainModule.filename); })(); 并将此文件导入您喜欢的任何位置。我需要查看您需要此文件的目录结构。
      • 如果你的文件是像这样的一个文件夹深度导入```const rootPath = require('./root');`,在google上搜索如何在nodejs中从不同级别导入文件。
      猜你喜欢
      • 2019-10-24
      • 1970-01-01
      • 2022-01-23
      • 2019-08-02
      • 2019-05-27
      • 2011-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多