目录
1、使用 express-generator 快速创建应用程序骨架
1、使用 express-generator 快速创建应用程序骨架
Express 生成器 - Express 中文文档 (nodejs.cn)
1.1、初始化
使用 express-generator
可以快速创建一个基于 Express 框架的 Node.js 项目。以下是创建项目的步骤:
-
首先,确保你已经安装了 Node.js。我使用的是node16版本
-
安装
express-generator
全局命令行工具。打开命令行窗口,输入以下命令:
npm install -g express-generator
-
使用
express
命令创建项目。假设你想创建一个名为myapp
的项目,可以输入以下命令:
express myapp
这将在当前目录下创建一个名为 myapp
的新目录,其中包含了项目的基本结构。
-
进入项目目录,安装依赖,并启动项目
# 进入项目的目录
cd myapp
# 初始化依赖
npm i
# 启动项目
npm start
现在,你的 Express 应用应该已经运行在 http://localhost:3000。
以下是 express-generator
创建的项目的基本目录结构:
myapp/ ├── app.js ├── bin │ └── www ├── package.json ├── public │ ├── images │ ├── javascripts │ └── stylesheets │ └── style.css ├── routes │ ├── index.js │ └── users.js └── views ├── error.pug ├── index.pug └── layout.pug
默认情况下,express-generator
使用 Pug 作为模板引擎,但你也可以通过命令行参数指定其他模板引擎,例如:
# 选择ejs
express --view=ejs myapp
以便在应用启动时打印出可访问的地址并提示启动成功,可以在 bin/www
文件中修改启动脚本。
在bin/www文件中的onListening函数添加console.log即可
/**
* Event listener for HTTP server "listening" event.
*/
function onListening() {
var addr = server.address();
var bind = typeof addr === 'string'
? 'pipe ' + addr
: 'port ' + addr.port;
debug('Listening on ' + bind);
// 打印可访问的地址并提示启动成功
console.log(`Server is running at http://localhost:${addr.port}`);
console.log('Server started successfully');
}
1.2、编写接口
(我这里只是为了测试,因此数据都是写死的)
在 myapp
目录中,找到 routes
文件夹,并创建一个新的 JavaScript 文件,例如 version.js
。在这个文件中,编写以下代码来创建 getVersion
接口:
const express = require('express');
const router = express.Router();
router.get('/getVersion', (req, res) => {
res.json({ version: '1.0.0' });
});
module.exports = router;
在 app.js
文件中,引入这个新的路由文件:
const versionRouter = require('./routes/version');
app.use('/', versionRouter);
启动应用:在 myapp
目录中,使用以下命令启动应用:(这里没有使用热更新,因此需要重启应用)
npm run start
访问 getVersion 接口:在浏览器或任何 HTTP 客户端中,访问以下 URL 来获取版本信息:
http://localhost:3000/getVersion
这将返回一个包含版本信息的 JSON 对象,例如:{ "version": "1.0.0" }
1.3、创建下载文件接口
(同样也是为了测试前端)
在 myapp
目录中,找到 routes
文件夹,并创建一个新的 JavaScript 文件,例如 download.js
。在这个文件中,编写以下代码来创建 getVersion
接口:
const express = require('express');
const router = express.Router();
const path = require('path');
const fs = require('fs');
// 假设您的文件存储在 public/downloads 目录下
const downloadsFolder = path.join(__dirname, '..', 'public', 'downloads');
router.get('/getFile/:filename', (req, res) => {
const { filename } = req.params;
const filePath = path.join(downloadsFolder, filename);
console.log('filename', filename)
console.log('filePath', filePath)
// 检查文件是否存在
fs.access(filePath, fs.constants.F_OK, (err) => {
if (err) {
// 文件不存在
return res.status(404).send('File not found');
}
// 设置响应头
res.setHeader('Content-Disposition', `attachment; filename=${filename}`);
res.setHeader('Content-Type', 'application/octet-stream');
// 创建可读流并管道传输到响应对象
const fileStream = fs.createReadStream(filePath);
fileStream.pipe(res);
});
});
module.exports = router;
在应用中使用该路由,(例如 app.js
),引入并使用这个路由:
const downloadRouter = require('./routes/download'); // 假设您的路由文件名为 download.js
const app = express();
...
// 使用下载路由
app.use('/api', downloadRouter);
重启服务器,访问下载接口,假设在 public/downloads 目录下有example.zip文件
http://localhost:3000/api/download/example.zip
当用户访问这个 URL 时,浏览器会提示保存文件,用户可以选择保存的位置。
注意事项
-
确保
public/downloads
目录中的文件对服务器进程是可读的。 -
因为我只是测试,所以很多地方欠缺考虑,写的有点简陋;里面可以考虑设置合理的错误处理,例如处理文件读取错误或文件不存在的情况。
1.4、允许跨域
在 Express 应用中允许跨域请求,您可以使用 cors
中间件。
首先,需要安装 cors
包。打开终端,并导航到项目目录,然后运行以下命令:
npm install cors
在 Express 应用中引入并使用 cors
中间件:
const express = require('express');
const cors = require('cors');
const app = express();
// 使用 cors 中间件来允许跨域请求
app.use(cors());
// ... 其他中间件和路由设置 ...
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
使用 cors()
不带任何参数时,它将允许所有来源的跨域请求。如果您需要更细粒度的控制,可以传递一个配置对象来定义具体的跨域策略:
app.use(cors({
origin: 'http://example.com', // 允许来自特定域的请求
methods: 'GET,POST,PUT,DELETE', // 允许的 HTTP 方法
allowedHeaders: 'Content-Type,Authorization' // 允许的请求头
}));