原创 前端双越老师 2025-09-24 08:30 重庆
点击关注公众号,技术干货及时达。
console.log('hello world')一段字符串能干嘛?能看,能读,能写,能复制,能粘贴。如果是富文本能设置一下颜色字体大小等...它能被执行吗?如果我们拷贝一段 JS 代码,穿越到 JS 语言发明之前的 90 年代(那会儿 PC 技术已经很发达了,盖茨早就世界首富了),你如何执行它?不能。最开始 JS 代码(字符串)是在浏览器中执行的。浏览器中内置了 JS 解释器,然后你在 html 代码中通过特定的语法 <script> 标签内嵌 JS 代码,浏览器识别以后执行这段 JS 代码。「一个语言的执行环境,我们就称为 runtime “运行时”」,没有 runtime 代码就无法被执行,就是一堆字符串,任何语言都需要 runtime 。Nodejs 就是继浏览器以后第二个 JS 代码的 runtime 运行时。从此以后,JS 代码不只能运行在浏览器了,它还可以运行在 Nodejs 环境。而 Nodejs 可以被安装在任何操作系统中(windows mac linux 等),也就是说 JS 代码可以在任何电脑上运行,即便没有浏览器也可以运行。现在的 JS 运行时除了浏览器、Nodejs 之外还有 Deno Bun ,这俩用途都和 Nodejs 类似,而且目前尚未全面流行,你可以先保持观察,不用深入。安装 Nodejs 并写 demo现代前端开发都是用 npm 管理插件,用 nodejs 支持打包工具,所以你应该是安装了 nodejs 的。如果没有安装,就下载安装一下,安装完以后打开控制台输入一下命令,可以看到 Nodejs 的版本。然后在控制台输入node --versionnpm --version
node 即可进入 nodejs 环境,可输入任何 JS 代码,按 ctrl+c 退出.js 文件,然后使用 node 命令来执行它。例如我在当前的 src 目录下创建了 test.js 文件然后使用// src/test.jsfunction fn() {console.log('this is a test file')}fn()
node 命令执行它,即可打印预期的结果alert('hello') 就报错了 alert is not defined 即 alert 没有定义,Nodejs 中没有 alert ,只有浏览器中才有 alert 。documentgetElementByIdcreateElementappendChild 等DOM 事件,如 addEventListenerBOM 操作,如 windownavigationsreen 等XMLHTTPRequest ,但 fetch 是可以在 Nodejs 中使用的Nodejs 内置的 APINodejs 不能使用浏览器 API ,这个好理解,因为不是浏览器环境。但如果 Nodejs 只能执行 JS 语法,没有其他 API 这也不行啊。因为光有 JS 语法,写个函数、做个计算、打印个字符串等,解决不了具体的问题呀。所以,Nodejs 也需要提供(内置)其他 API 让我们能开发具体的功能。Nodejs 是作为一个软件安装在操作系统上的,所以 Nodejs 提供了关于操作系统的 API新建一个文件 os.js 写入如下代码然后在控制台使用// src/os.jsconst os = require('os') // 和 import 语法类似function getSystemInfo() {return {platform: os.platform(),type: os.type(),architecture: os.arch(),cpuCount: os.cpus().length,cpuModel: os.cpus()[0].model,totalMemoryGB: Math.round(os.totalmem() / 1024 / 1024 / 1024),hostname: os.hostname(),}}const systemInfo = getSystemInfo()console.log(systemInfo)
node 命令执行这个文件,即可打印我当前的系统信息src/file.js 写入如下代码首先,引入 fspath 两个模块。其中 fs 就是 file system 文件系统,用于操作文件,path 用于操作文件路径。然后定义文件路径,我们计划在const fs = require('fs')const path = require('path')
file 目录下创建 data.txt 文件然后创建文件// 定义文件路径const fileDir = path.join(__dirname, '../file')const filePath = path.join(fileDir, 'data.txt')
在控制台执行// 功能1: 在 /file 目录下创建 data.txt 文件并写入内容function createAndWriteFile() {// 确保文件目录存在,否则先目录和文件if (!fs.existsSync(fileDir)) {fs.mkdirSync(fileDir, { recursive: true }) // 创建目录和文件console.log('创建目录:', fileDir)}// 写入文件内容fs.writeFileSync(filePath, content, 'utf8') // 写入内容console.log('文件创建成功:', filePath)console.log('写入内容:', content)}createAndWriteFile()
node src/file.js 可以看到 data.txt 文件被创建出来了在控制台执行// 功能2: 读取文件内容function readFile() {try {const data = fs.readFileSync(filePath, 'utf8') // 读取文件内容console.log('读取的文件内容:', data)return data} catch (error) {console.error('读取文件失败:', error.message)return null}}readFile()
node src/file.js 可以看到读取了正确的文件内容src/http.js 写入如下内容引入 Nodejs 内置的 http 模块,用于启动 HTTP 服务通过 createServer 创建一个 HTTP 服务,函数内的两个参数分别代表 Request 和 Response ,这两个是 HTTP 协议的基础知识 —— 你写前端 ajax 也用得着,默认你已经熟知函数内,通过 res.setHeader 设置 HTTP header(前端 ajax 也需要设置 header),返回格式为 JSON函数内,通过 res.end 返回本次请求的内容,要返回字符串格式通过 server.listen 监听 3000 端口在控制台运行const http = require('http')// 创建 HTTP 服务器const server = http.createServer((req, res) => {// 设置响应头为 JSON 格式res.setHeader('Content-Type', 'application/json')// 创建要返回的 JSON 数据const response = {message: 'Hello World!',time: new Date().toLocaleString(),status: 'success',}// 返回 JSON 响应res.end(JSON.stringify(response, null, 2))})// 监听 300 端口server.listen(3000, () => {console.log('HTTP 服务器已启动,监听端口: 3000')console.log('访问地址: http://localhost:3000')})
node src/http.js 可启动本地的 HTTP 服务,并监听 3000 端口localhost:3000 可以看到服务端返回的 JSON 内容,说明 API 接口成功了src/http-post.js 代码如下,模拟一个创建用户的 API 接口使用 req.method 可以获得前端 ajax 请求的 method ,这里规定必须是 POST使用 req.url 可以获得前端 ajax 请求的路由,这里规定必须是 /api/user使用 req.on('data', (chunk) => { }) 可以接收到客户端传递过来的 request body 数据控制台运行const http = require('http')// 创建 HTTP 服务器const server = http.createServer((req, res) => {// 设置响应头为 JSON 格式res.setHeader('Content-Type', 'application/json')// 检查是否为 POST 请求且路由为 /api/userif (req.method === 'POST' && req.url === '/api/user') {let body = ''// 接收数据req.on('data', (chunk) => {body += chunk.toString()})// 数据接收完成req.on('end', () => {try {// 解析 JSON 数据const userData = JSON.parse(body)// 打印接收到的数据console.log('接收到的用户数据:', userData)console.log('userId:', userData.userId)console.log('name:', userData.name)console.log('email:', userData.email)// TODO...// 返回成功响应const response = {status: 'success',}res.statusCode = 200res.end(JSON.stringify(response))} catch (error) {// 如果 JSON 解析失败,返回错误const response = {status: 'error',message: '无效的 JSON 数据',}res.statusCode = 400res.end(JSON.stringify(response))}})} else {// 其他请求返回简单提示const response = {message: '请发送 POST 请求到 /api/user',}res.end(JSON.stringify(response))}})// 监听 3000 端口server.listen(3000, () => {console.log('HTTP 服务器已启动,监听端口: 3000')console.log('POST 请求地址: http://localhost:3000/api/user')})
node src/http-post.js 启动服务并监听 3000 端口。但 POST 请求我们不能直接使用浏览器访问测试,因为浏览器访问是 GET 请求。测试 POST 请求一般有两种方式,如果你控制台支持 curl 命令,可以使用它来测试,在控制台运行或者,你安装 Postman 然后选择 POST 输入 url 和 body 信息,点击 Send 按钮,即可得到返回结果。curl -X POST http://localhost:3000/api/user \-H "Content-Type: application/json" \-d '{"userId": 123, "name": "张三", "email": "zhang@example.com"}'
// TODO... 位置,可以把 user 数据插入到数据库,这一点后面再说。Koa 框架在 Nodejs 刚开始流行的时候,早就有人总结了 Nodejs 作为服务端的通用能力,并且开发了框架,可以让我们更加便捷的开发 Nodejs 服务端,其中最出名的就是 express 和 koa 。两者设计思路和使用方式都一样,而且很多年都没变,早已稳定了,我们以后者 koa 为例。新建一个目录,执行 npm init -y 创建一个 package.json 文件,和做前端开发一样。然后安装 koa 和 nodemon ,后者用于启动服务,和代码逻辑没关系,可暂时不用管然后创建一个目录npm i koanpm i nodemon -D
src 再在里面创建一个文件 index.js 写入如下代码然后在 package.json 文件加入一个命令// src/index.jsconst Koa = require('koa')const app = new Koa()app.use(async (ctx) => {ctx.body = 'Hello World'})app.listen(3000)
"dev": "nodemon src/index.js"npm run dev 就可以启动 nodejs 服务,用浏览器访问 localhost:3000 就可以看到访问结果ctx.body 赋值一段 JSON 即可,不用考虑转换为字符串格式npm i koa-body 它可用于获取 request body 数据使用 ctx.method 判断 Method ,其他就很简单了启动 nodejs 服务端以后,我们使用 Postman 测试如下,而且服务端也打印了正确的结果const Koa = require('koa')const { koaBody } = require('koa-body')const app = new Koa()app.use(koaBody())app.use(async (ctx) => {if (ctx.method === 'POST') {const { user, email } = ctx.request.body || {}console.log('user and email ', user, email)// 其他处理,如 await insertUserToDatabase(user, email)ctx.body = {status: 'success',user,email,}}})app.listen(3000)
npm install @koa/router代码如下通过 router.post 即可定义method 和路由 path还可以继续扩展其他路由至此,你已经看到 koa 是如何启动 nodejs 服务并且处理基础的请求,其他更多的 API 你可以参考文档,也可以直接咨询 AI 更方便。只要你熟悉前端 ajax 请求和 HTTP 协议,那这些知识点基本都难不倒你。操作数据库数据库最常见的操作就是增删改查 CRUD ,你可能之前听说过操作数据库需要专门的 SQL 语言,挺麻烦的。其实现在做常见的 web 应用开发,基本不会使用 SQL 语句了,最常见的就是 ORM 工具,例如 Prisma你一开始看它的文档肯定是看不懂的,而且也不需要你立刻看懂所有的,你只需要知道它是如何增删改查的就可以入门了。下面这段代码能看懂吗?不要管它如何执行,你能看懂语意就可以,仅语意。数据库里有一个const Koa = require('koa')const koaBody = require('koa-body')const Router = require('@koa/router')const app = new Koa()const router = new Router()app.use(koaBody())router.post('/api/user', (ctx) => {const { user, email } = ctx.request.body || {}console.log('user and email ', user, email)// 其他处理,如 await insertUserToDatabase(user, email)ctx.body = {status: 'success',user,email,}})// 继续扩展其他路由...app.use(router.routes())app.use(router.allowedMethods())app.listen(3000)
user 表(就像一个 excel 表),这一点代码中没写在 user 表中创建一行数据,两列 name 和 email查询这个表中的所有数据,并打印我想大部分人应该都能看懂这几行代码的语意,其实现代 ORM 工具操作数据库就是使用async function main() {await prisma.user.create({data: {name: 'Alice',email: 'alice@prisma.io',},})const allUsers = await prisma.user.findMany()console.dir(allUsers, { depth: null })}
createfinedupdatedelete 等这些函数进行增删改查的操作,并不是 SQL 语句。再来个复杂一点的例子,这个不要求看懂,当然能看懂最好数据库中有三个表 userprofileposts在 user 表中创建一行,两列 nameemail ,同时:在 posts 表中插入一行,一列 title在 profile 表中插入一行,一列 bio查询所有 user 表中的数据,同时查询出 posts 和 profile 两个表的相关数据把数据库的增删改查结合到上面 nodejs 服务端代码中,就可以开发一个基础的数据服务 API 。调用第三方服务第三方服务一般都是 API 的形式,一般有两种调用方式,以 deepseek API 为例第一种方式,直接发送 http 请求调用,deepseek API 文档是使用 curl 工具举例的async function main() {await prisma.user.create({data: {name: 'Alice',email: 'alice@prisma.io',posts: {create: { title: 'Hello World' },},profile: {create: { bio: 'I like turtles' },},},})const allUsers = await prisma.user.findMany({include: {posts: true,profile: true,},})console.dir(allUsers, { depth: null })}
其实我们可以转换为 nodejs 内置的curl https://api.deepseek.com/chat/completions \-H "Content-Type: application/json" \-H "Authorization: Bearer <DeepSeek API Key>" \-d '{"model": "deepseek-chat","messages": [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": "Hello!"}],"stream": false}'
fetch 方法去请求,这是我用 AI 生成的代码第二种方式,有的第三方开放平台会开发一个 npm 插件,让你直接安装并调用它的方法。例如调用 deepseek API 可以安装 openaiawait fetch('https://api.deepseek.com/chat/completions', {method: 'POST',headers: {'Content-Type': 'application/json','Authorization': 'Bearer <DeepSeek API Key>' // 请替换为你的实际 API Key},body: JSON.stringify({model: "deepseek-chat",messages: [{ role: "system", content: "You are a helpful assistant." },{ role: "user", content: "Hello!" }],stream: false})});
npm i openai然后直接引入并调用它的方法即可。其实它背后也是发送 HTTP 请求,不过它封装了。把调用 deepseek API 结合到上面 nodejs 服务端代码中,就可以开发一个自己的 AI 接口服务。// Please install OpenAI SDK first: `npm install openai`import OpenAI from "openai";const openai = new OpenAI({baseURL: 'https://api.deepseek.com',apiKey: '<DeepSeek API Key>'});async function main() {const completion = await openai.chat.completions.create({messages: [{ role: "system", content: "You are a helpful assistant." }],model: "deepseek-chat",});console.log(completion.choices[0].message.content);}main();
AI编程资讯AI Coding专区指南:
点击"阅读原文"了解详情~
