Как решить проблемы с путями при перемещении файлов в node.js ?

#javascript #node.js #express #google-cloud-functions

#javascript #node.js #экспресс #google-cloud-функции

Вопрос:

Я пытаюсь получить файл из 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:UsersMaisum AbbasnowfunctionssendMail.txt' 
> 'C:functionssendMail.txt'] {    
>    errno: -4058,
>    code: 'ENOENT',
>    syscall: 'rename',
>    path: 'C:\Users\Maisum Abbas\now\functions\sendMail.txt',
>    dest: 'C:\functions\sendMail.txt'
>  }
  

Кроме того, это путь, по которому я хочу фактически переместить файл, но oldpath уже настроен таким образом.

 C:UsersMaisum AbbasnowfunctionssendMail.txt 
  

Ответ №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 не позволяет записывать какие-либо файлы в любом месте файловой системы, за исключением os.tmpdir() (которая является / tmp в Linux).

Если вам нужно временно записать файл, вам определенно следует использовать только это пространство tmp. Имейте в виду, что записанные там файлы занимают память и должны быть удалены до завершения работы функции, иначе может произойти утечка памяти.

Вы можете читать файлы, которые вы развернули с помощью своего кода, но вы должны делать это по относительным путям.

Комментарии:

1. Мне просто нужен файл, чтобы прикрепить его в качестве вложения и отправить электронное письмо, для этого мне просто нужен правильный путь, если каким-то образом я смогу это сделать, тогда мне не нужно перемещать файлы. Но по какой-то причине он проверяет только путь к файлу, где мой index.js вот почему я пытаюсь переместить его. Но, если есть какой-либо способ, который можно выполнить без перемещения файлов, пожалуйста, дайте мне знать. Я просмотрел различные сообщения, но у меня ничего не работает, или, возможно, я не смог сделать это должным образом.

2. если вы знаете имя вложения, вы можете получить корневой путь, а затем объединить местоположение, например «filePath = rootPath ‘/имена папок / 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!')
  });

  

Комментарии:

1. Не создаст ли это проблем при его развертывании, поскольку корневой путь будет находиться в вашей системе? Кроме того, не создаст ли это также проблемы, если вы загрузите свой файл с какого-либо другого пути, просто мысль? Я совершенно новичок в node.js так что не могу сказать, много ли смысла в моих словах.

2. Это не создаст никаких проблем на сервере. Если вы хотите загрузить свой файл из другого каталога, вы просто объединяете newPath = rootPath folderWhereToUpload whateverFileNameYouWant;

3. Можете ли вы показать мне, как вы импортируете свой корневой путь?

4. создайте файл в корне проекта и назовите его следующим образом root.js а затем вставьте const path = require('path'); module.exports = (function(){ return path.dirname(require.main.filename || process.mainModule.filename); })(); и импортируйте этот файл, куда хотите. Мне нужно увидеть вашу структуру каталогов, где вам требуется этот файл.

5. Если ваш файл представляет собой глубокую папку, импортируйте вот так «const rootPath = require(‘./root’);`, Найдите в Google, как импортировать файл с другого уровня в nodejs.