تو کدت داری میگی :
await fsPromises.rename('/tmp/a.png', '/home/username/projectname/img/a.png');
یهو نود.جیاس بر میگرده بهت میگه ذکی. خیال کردی به همین سادگیه. بعد تو متوجه میشی که توی لینوکس همچین کاری نمیشه کرد.
توضیح بیشترش اینه: شما توی لینوکس وقتی میخوای یه فایلی رو میخوای از یه فایل سیستمی که روی یه جا mount شده رو یه فایل سیستم دیگه که رو یه جا دیگه mount شده rename بکنی بهت اجازه نمیده.
برا اطلاعات بیشتر در مورد فایل سیستم این پست تو ویرگول و این Q&A تو استک خوبه.
تو فرم های دیگه پکیج csurf به درستی کار میکنه ولی وقتی از یه فرم که enctype اش رو multipart/form-data گذاشتی درخواست سمت سرور میفرستی به این ارور میخوری که میگه توکن ولید نیس. همه چیزا رو هم چک کردی: مثلا توکنی که داره تو input hidden میزاره درسته و اگرم از طریق header داری توکن رو ارسال میکنی بازم همه چی رو به راه هس.
مشکل از نحوهی تعریف middleware هات هس. یعنی چی؟ وقتی middleware ای که توش توکن csurf ست میشه رو قبل از middleware ای که فایل ها رو آپلود میکنه تعریف بکنی همچین مشکلی برات بوجود میاد.
پس اگه از یه پکیجی استفاده میکنی که بعد از csurf میاد آپلود کردن فایل ها رو برات ساده میکنه، مثل connect-multiparty بیا اونو قبل از csurf تعریف بکن. یعنی تو app.js ات قبل از این خط:
app.use(csurf({ cookie: true }));
اگرم از پکیجی مثل express-fileupload استفاده میکنی که باید همچین عمل بکنی میشه:
const fileUpload = require('express-fileupload'); const cookieParser = require('cookie-parser'); app.use(cookieParser()); app.use(fileUpload({ limits: { fileSize: 50 * 1024 * 1024 }, useTempFiles: true, tempFileDir: '/tmp/' })); app.use(csurf({ cookie: true }));
برا بیشتر خوندن این Q&A استک خوبه