初始化node项目express,项目结构介绍
一,初始化node项目
1、环境搭建
验证是否安装node和npm
2、项目初始化
mkdir myNodeapp //创建node文件
cd myNodeapp //切换到当前文件目录
npm init -y
通过 npm init 命令生成 package.json 文件,它包含了项目的配置信息。
{"name": "mynodeapp", //当前项目名称"version": "1.0.0", //项目版本号"main": "index.js", //指定了项目的入口文件,当其他模块引入你的项目时,Node.js会首先加载这个文件"scripts": { //包含可运行的npm脚本"test": "echo \"Error: no test specified\" && exit 1"},"keywords": [],"author": "","license": "ISC","description": "" //用于描述项目功能
}
3、创建入口文件
在项目根目录 下创建一个 app.js 文件,这是应用的入口文件,用于设置服务器和处理请求。
4、编写简单服务器代码
const http = require('http');// 创建服务器
const server = http.createServer((req, res) => {// 设置HTTP响应的状态码和头信息res.writeHead(200, {// 设置内容类型为 HTML,并指定字符集为 UTF-8,这样中文不会乱码'Content-Type': 'text/html; charset=utf-8' });// 发送响应体res.end('<h1>Hello, World!</h1><p>这是我的第一个 Node.js 应用。</p>');
});// 监听端口
const PORT = 3000;
server.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});
5、运行服务器
npm start
你会看到控制台输入以下信息
Server is running on http://localhost:3000
6、访问服务链接
7、添加路由
require('http')
:加载Node.js内置的HTTP模块,主要是创建Web服务器,处理HTTP请求和响应,包含请求/响应对象、URL处理等网络通信工具http.createServer()
方法就是用来创建一个 HTTP 服务器实例。
const http = require('http');const server = http.createServer((req, res) => {if (req.url === '/') {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('Welcome to the homepage!');} else if (req.url === '/about') {res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('This is the about page.');} else {res.writeHead(404, { 'Content-Type': 'text/plain' });res.end('404 Not Found');}
});const PORT = 3000;
server.listen(PORT, () => {console.log(`Server is running on http://localhost:${PORT}`);
});
二,express框架创建node项目
上述是使用node创建一个简单的应用,有些人就会问了,为什么我的项目文件更多,与老师你的项目文件用法也不一样,第一要么是你自定义了自己的文件,第二要么就是用来已有的框架搭建的node项目,以上问题,我主要讲下我们常用的express框架搭建的node项目
1.全局安装 express 生成器
npm install -g express-generator
2.下面创建一个名为 myapp 的 Express 应用。
express myapp
执行上述命令会得到以下项目结构包
根据要求将终端命令目录切换到myapp,指向npm install 下载相关依赖
3.项目依赖包安装
执行npm install 命令之后,依赖包node_modules依赖安装完成,我们还需要安装一些常用的依赖工具包
npm install nodemon mysql2 redis sequelize sqlite3
包名 | 概述 |
---|---|
nodemon | 实时重启项目 |
mysql2 | mysql数据驱动 |
sequelize | mysql orm 操作包 |
4.项目启动
执行命令 npm start
npm start
项目启动后打开浏览器输入 http://localhost:3000
效果如下
5. 启动文件修改
由于我们的www.js文件输出不带有ip地址,不太友好,打开项目根目录下的 bin/www
文件,将下方内容复制全部替换掉,其中引入了os-node内置模块,通过os.networkInterfaces()
获取所有网络接口信息
#!/usr/bin/env node/*** Module dependencies.*/var app = require('../app');
var debug = require('debug')('myapp:server');
var http = require('http');
const os = require('os');/*** Get port from environment and store in Express.*/var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);/*** Create HTTP server.*/var server = http.createServer(app);/*** Listen on provided port, on all network interfaces.*/server.listen(port);
server.on('error', onError);
server.on('listening', onListening);/*** Normalize a port into a number, string, or false.*/function normalizePort(val) {var port = parseInt(val, 10);if (isNaN(port)) {// named pipereturn val;}if (port >= 0) {// port numberreturn port;}return false;
}/*** Event listener for HTTP server "error" event.*/function onError(error) {if (error.syscall !== 'listen') {throw error;}var bind = typeof port === 'string'? 'Pipe ' + port: 'Port ' + port;// handle specific listen errors with friendly messagesswitch (error.code) {case 'EACCES':console.error(bind + ' requires elevated privileges');process.exit(1);break;case 'EADDRINUSE':console.error(bind + ' is already in use');process.exit(1);break;default:throw error;}
}/*** Event listener for HTTP server "listening" event.*/function onListening() {var addr = server.address();var bind = typeof addr === 'string'? 'pipe ' + addr: 'port ' + addr.port;// 获取本地IP地址var localIP = getLocalIP();console.log('localIP',localIP);console.log(`Your app is running at http://${localIP}:${bind}`);debug('Listening on ' + bind);
}function getLocalIP() {var interfaces = os.networkInterfaces();var localIP = 'localhost';for (var devName in interfaces) {var iface = interfaces[devName];for (var i = 0; i < iface.length; i++) {var alias = iface[i];// 筛选IPv4地址,排除内部和环回地址if (alias.family === 'IPv4' && !alias.internal && alias.address !== '127.0.0.1') {// 优先选择以太网或无线网络接口if (devName.toLowerCase().includes('eth') || devName.toLowerCase().includes('wlan') ||devName.toLowerCase().includes('en')) {return alias.address;}localIP = alias.address;}}}return localIP;
}
三、node(express框架)项目结构及介绍
my-express-app/
│
├── bin/ # 启动脚本目录
│ └── www # 应用启动文件
│
├── config/ # 配置文件目录
│ └── default.js # 默认配置文件
│
├── controllers/ # 控制器目录,处理路由和业务逻辑
│ └── userController.js
│
├── middleware/ # 中间件目录
│ └── auth.js # 身份验证中间件
│
├── models/ # 数据模型目录
│ └── user.js # 用户模型
│
├── routes/ # 路由文件目录
│ └── userRoutes.js # 用户相关路由
│
├── services/ # 服务层目录,处理复杂的业务逻辑
│ └── userService.js # 用户服务
│
├── views/ # 视图文件目录(如果使用模板引擎)
│ └── index.ejs # 主页视图文件
│
├── public/ # 公共资源目录,存放静态文件(如图片、CSS、JS等)
│ ├── images/
│ └── stylesheets/
│
├── node_modules/ # Node.js 依赖包
│
├── package.json # 项目元数据和依赖管理文件
└── README.md # 项目说明文件
- bin/:存放启动脚本,
www
文件是启动应用的入口文件,它通常用来启动 Express 服务器。 - config/:存放配置文件,
default.js
存储一些默认配置项,如数据库连接、端口等。 - controllers/:控制器目录,负责处理路由和应用的核心业务逻辑。
- middleware/:存放中间件文件,包含身份验证、日志记录等功能。
- models/:数据模型目录,通常与数据库进行交互。每个模型文件通常对应数据库中的一张表。
- routes/:路由文件目录,定义不同的 API 路由并与控制器进行关联。
- services/:服务层,处理复杂的业务逻辑,可以调用多个控制器来完成一个请求。
- views/:视图文件,通常与模板引擎(如 EJS、Pug)配合使用,生成动态的 HTML 页面。
- public/:存放静态文件,如图片、样式表和前端脚本。
- node_modules/:存放所有项目的 Node.js 依赖包。
- package.json:管理项目依赖、脚本和项目配置。
- README.md:项目说明文件,提供项目介绍、安装和使用文档。