如何在运行 Node.js 的服务器上保存文件?

Posted

技术标签:

【中文标题】如何在运行 Node.js 的服务器上保存文件?【英文标题】:How to save a file on server running Node.js? 【发布时间】:2017-07-20 11:11:44 【问题描述】:

我有一个运行 Node.js 的服务器。我必须从 html 页面(“index.html”)读取表单数据并将该数据写入 txt 文件。

这是我的 index.html:

<form action="/uploads" method="post">
   <table>
      <tr>
         <td><img src="images/ktulogo.png"  ></td>
         <td>
            <h3>Karadeniz Teknik Üniversitesi Bilgisayar Mühendisliği Bölümü</h3>
         </td>
      </tr>
      <tr>
         <td><br></td>
         <td>
            <hr>
         </td>
      </tr>
      <tr>
         <td>
            <h4>Adınız Soyadınız :</h4>
         </td>
         <td><input type="text" style="margin-left: 5%; width: 40%"></td>
      </tr>
      <tr>
         <td>
            <h4>Öğrenci Numaranız :</h4>
         </td>
         <td><input name="ogrNo" type="text" style="margin-left: 5%; width: 40%"></td>
      </tr>
      <tr>
         <td>
            <h4>Cevabınız :</h4>
         </td>
         <td><textarea name="answer" datatype="text" rows="10" cols="100" style="margin-left: 5%; resize: none"></textarea></td>
      </tr>
   </table>
   </br>
   <center>
      <button id="saveFile" class="btn btn-success" style="width: 30%">Sisteme Yükle</button>
   </center>
</form>

这是我的 app.js:

var express = require('express');
var app = express();
var path = require('path');
var fs = require('fs');

app.use(express.static(path.join(__dirname, 'public')));

app.get('/', function(req, res)
    res.sendFile(path.join(__dirname, 'views/index.html'));
);

app.post('/uploads', function (req, res) 
    var file_name = req.body.ogrNo;
    var file_content = req.body.answer;
    file_content = file_content.replace(/\n/g, "\r\n");

    var stream = fs.createWriteStream(file_name+".txt");
    stream.once('open', function () 
        stream.write(file_content);
        stream.end();
    );
);

var server = app.listen(3000, function()
    console.log('Server listening on port 3000');
);

当我运行它时,它会抛出一个错误:

TypeError:无法读取未定义的属性“ogrNo” 在 c:\Users\Volkan\IdeaProjects\File Upload\app.js:13:27 在 Layer.handle [as handle_request] (c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\layer.js:95:5) 在下一个(c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\route.js:131:13) 在 Route.dispatch (c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\route.js:112:3) 在 Layer.handle [as handle_request] (c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\layer.js:95:5) 在 c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\index.js:277:22 在 Function.process_params (c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\index.js:330:12) 在下一个(c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\index.js:271:10) 在serveStatic (c:\Users\Volkan\IdeaProjects\File Upload\node_modules\serve-static\index.js:75:16) 在 Layer.handle [as handle_request] (c:\Users\Volkan\IdeaProjects\File Upload\node_modules\express\lib\router\layer.js:95:5)

那么,我的问题是什么原因造成的,或者我该如何处理这份工作?

【问题讨论】:

检查您的请求! 正文未定义。你错过了github.com/expressjs/body-parser 我处理!你是对的@BorisCharpentier,谢谢! 【参考方案1】:

你必须解析传入的数据,为此使用body-parser

先安装

npm i -S body-parser

然后将其导入您的代码

var bodyParser = require('body-parser')

添加解析器

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded( extended: true ));

// parse application/json
app.use(bodyParser.json());

就是这样。

【讨论】:

也许在 2017 年使用 const 比使用 var 更好。也许不吧。有什么想法吗? 当然最好使用const来处理这些事情,但是对于这种情况没有意义:)

以上是关于如何在运行 Node.js 的服务器上保存文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 formData 对象中附加文件而不在 Node.js 中物理保存文件?

上传图片文件到服务器node.js express axios

如何使用 Node.js 从 Supabase Storage 保存文件(将 blob 转换为文件)

node 怎么在服务器上运行?

如何在 google appengine 上为 node.js 运行 nightmare.js

如何从 Angular 6 向 node.js 发送 https 请求