最近测试小程序的接口,需要我提供一个后端服务的文件上传接口。可以使用 Node.js 创建一个这样的上传文件的接口。主要会用到 Express,Multer 这两个 Package。另外可以把上传的结果存储在数据库里,我用了一个叫 Loki 的数据库,这个数据库会在内存里运行,使用简单,速度快。
准备项目
为项目准备一个 package.json 文件。
npm init -y
安装包
npm install express multer cors --save
express 用来创建接口,multer 可以处理文件的上传,cors 可以方便的解决跨域请求问题,比如你的前端应用或者小程序要请求后端服务接口,就会有跨域问题,你得设置一些头部信息解决这个问题。
再安装一个开发依赖叫 nodemon,它会帮我们重启服务。
npm install nodemon --save-dev
文件上传
在项目下面创建一个 upload.js,可以放在 src 目录的下面。内容如下:
src/upload.js
const multer = require('multer')
const fileFilter = (request, file, callback) => {
if (!file.originalname.match(/\.(jpg|jpeg|png|gif|mp3|mp4)$/)) {
return callback(new Error('wrong type :)'), false)
}
callback(null, true)
}
const upload = multer({ dest: 'uploads/', fileFilter })
module.exports = {
upload
}fileFilter 是个文件上传过滤器。upload 是创建的这个上传, dest 设置了文件上传的位置。
数据库
我们可以把文件上传的结果存储在数据库。创建一个 db.js,放在 src 目录的下面。
src/db.js
const loki = require('lokijs')
const loadCollection = (collectionName, db) => {
return new Promise(resolve => {
db.loadDatabase({}, () => {
const collection = db.getCollection(collectionName) || db.addCollection(collectionName)
resolve(collection)
})
})
}
const db = new loki('uploads/uploads.json', { persistenceMethod: 'fs' })
module.exports = {
loadCollection,
db
}loadCollection 可以为我们创建或者获取到数据库里指定的集合。db 是我们创建的数据库,它会存储在 uploads 目录的下面,名字是 uploads.json 。
接口与服务
在项目根目录下面,创建一个 index.js ,里面可以创建应用与接口。
const express = require('express')
const cors = require('cors')
const { loadCollection, db } = require('./db')
const { upload } = require('./upload')
const app = express()
const router = express.Router()
app.use(cors())
router.route('/uploads')
.post(upload.array('uploads', 9), async (request, response, next) => {
const collection = await loadCollection('uploads', db)
const result = collection.insert(request.files)
db.saveDatabase()
response.send(
result
)
})
app.use('/api', router)
app.listen(8080, () => {
console.log('localhost:8080')
})
上面创建了一个 /uploads 接口,用 POST 方法请求 /api/uploads 的时候会用它来处理。里面的 upload.array 可以处理多个文件的上传,9 是设置的一次最大可以上传的文件数量。
package.json
打开 package.json,在 script 里面,添加一条脚本:
"scripts": {
"start": "./node_modules/.bin/nodemon index.js"
},启动
在命令行下面,执行:
npm start
测试
找一个 REST 客户端,比如 Postman 或者 Insomnia ,配置一个请求,方法是 POST,地址是 localhost:8080/api/uploads,添加一个请求主体,类型是 Multipart Form,添加一个元素,名字应该是 uploads ,类型是 file,选择一个文件,然后发送一下这个请求。会返回上传以后存储在数据库里的结果。在项目的 uploads 目录下面,你可以找到刚才上传的文件。

Node.js订阅宁皓网,学习更多 Node.js 相关课程。




评论
哇塞,搞得我又想续费了 🍻
8 年 3 个月 以前
浩哥, 在 index.js 中
const { loadCollection, db } = require('./src/db')
const { upload } = require('./src/upload')
而且 async await 低版本的node用不了
8 年 3 个月 以前
必须 Node v8 才支持
8 年 3 个月 以前
Typescript 应该能行。
8 年 3 个月 以前
有没有上传到mongodb的呀?比如GridFS之类的。谢啦 皓哥
7 年 7 个月 以前
还没有 :)不过我想以后看看实现直接把文件上传到阿里云 OSS 。
7 年 7 个月 以前