如何将Node静态服务器改写为支持长尾词查询的文件或文件夹读取功能?

2026-04-05 21:151阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计866个文字,预计阅读时间需要4分钟。

如何将Node静态服务器改写为支持长尾词查询的文件或文件夹读取功能?

现在我们已经深入理解了Node.js的基本工作原理,接下来将实现一个系统功能:读取文件或文件夹,记录日志,以及解决中文输出乱码问题。示例代码如下:

javascriptconst http=require('http');const fs=require('fs');const path=require('path');

const server=http.createServer((req, res)=> { if (req.method==='GET' && req.url==='/read') { const filePath=req.query.path; if (!filePath) { res.statusCode=400; res.setHeader('Content-Type', 'text/plain'); res.end('请提供文件路径'); return; }

fs.readFile(filePath, 'utf8', (err, data)=> { if (err) { res.statusCode=500; res.setHeader('Content-Type', 'text/plain'); res.end('读取文件失败'); } else { res.statusCode=200; res.setHeader('Content-Type', 'text/plain'); res.end(data); } }); } else if (req.method==='GET' && req.url==='/log') { const message=req.query.message; if (!message) { res.statusCode=400; res.setHeader('Content-Type', 'text/plain'); res.end('请提供日志信息'); return; }

console.log(message); res.statusCode=200; res.setHeader('Content-Type', 'text/plain'); res.end('日志记录成功'); } else if (req.method==='GET' && req.url==='/encode') { const text='中文输出'; res.statusCode=200; res.setHeader('Content-Type', 'text/plain; charset=utf-8'); res.end(text); } else { res.statusCode=404; res.setHeader('Content-Type', 'text/plain'); res.end('未找到请求的资源'); }});

server.listen(3000, ()=> { console.log('服务器运行在 http://localhost:3000');});

现在我们已经大致了解了node 的基本工作原理,现在来实现一个系统的功能 读取文件或者文件夹

采坑记录

中文输出乱码问题

res.statusCode = 200 res.setHeader('Content-Type', 'text/plain') res.end('啊啊和嘎哈啊')

输出中出现中文乱码 附解决方案 ~

res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })

res.writeHead(200, { 'Context-Type': 'text/plain' }) res.write('<head><meta charset="utf-8"/></head>')

文件读取方式

node 允许通过两种方式读取并输出文件

one : 以文件流的形式读取与返回一起进行,快 = 推荐

fs.createReadStream(filePath).pipe(res)

two : 先将文件整个读取,然后将文件内容一起返回,简单说这就是api的蹩脚使用 = 慢

fs.readFile(filePath, (err, data) => { if (err) return res.end(data) })

读取文件或者文件夹

废话不说,上代码

require('./config/defaultConfig') 更新为以下

module.exports = { // 主机名称 hostname: '127.0.0.1', // 端口号 port: 6969, // 当前文件夹 root: process.cwd() }

// 引入 ${conf.hostname}:${conf.port}` console.info(`server startd at ${chalk.green(addr)}`) })

代码优化

上述代码存在很多回调,代码臃肿可读性差。下面利用异步将回调去除,达到优化效果

require-atomic-updates 注意eslint对于此项的限制, 为此将实参await

const fs = require('fs') const promisify = require('util').promisify const stat = promisify(fs.stat) const readdir = promisify(fs.readdir) module.exports = async function(rep, res, filePath) { // 规避此问题require-atomic-updates报告在异步函数中重新分配变量时可能发生的竞争条件错误 const awaitRes = await res awaitRes.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }) try { const stats = await stat(filePath) if (stats.isFile()) { // 如果是文件 返回文件内容 awaitRes.statusCode = 200 fs.createReadStream(filePath).pipe(awaitRes) } else if (stats.isDirectory()) { // 如果是文件夹,返回文件列表 const file = readdir(filePath) awaitRes.statusCode = 200 awaitRes.end(file.join(',')) } } catch (ex) { // 状态码 awaitRes.statusCode = 404 // 找不到提示文本 awaitRes.end(`${filePath} is 404`) } }

app.js文件变更为

// 引入 ${conf.hostname}:${conf.port}` console.info(`server startd at ${chalk.green(addr)}`) })

至此实现了通过hash路径输入,实现文件或文件夹的读取/前进后退

如何将Node静态服务器改写为支持长尾词查询的文件或文件夹读取功能?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

本文共计866个文字,预计阅读时间需要4分钟。

如何将Node静态服务器改写为支持长尾词查询的文件或文件夹读取功能?

现在我们已经深入理解了Node.js的基本工作原理,接下来将实现一个系统功能:读取文件或文件夹,记录日志,以及解决中文输出乱码问题。示例代码如下:

javascriptconst http=require('http');const fs=require('fs');const path=require('path');

const server=http.createServer((req, res)=> { if (req.method==='GET' && req.url==='/read') { const filePath=req.query.path; if (!filePath) { res.statusCode=400; res.setHeader('Content-Type', 'text/plain'); res.end('请提供文件路径'); return; }

fs.readFile(filePath, 'utf8', (err, data)=> { if (err) { res.statusCode=500; res.setHeader('Content-Type', 'text/plain'); res.end('读取文件失败'); } else { res.statusCode=200; res.setHeader('Content-Type', 'text/plain'); res.end(data); } }); } else if (req.method==='GET' && req.url==='/log') { const message=req.query.message; if (!message) { res.statusCode=400; res.setHeader('Content-Type', 'text/plain'); res.end('请提供日志信息'); return; }

console.log(message); res.statusCode=200; res.setHeader('Content-Type', 'text/plain'); res.end('日志记录成功'); } else if (req.method==='GET' && req.url==='/encode') { const text='中文输出'; res.statusCode=200; res.setHeader('Content-Type', 'text/plain; charset=utf-8'); res.end(text); } else { res.statusCode=404; res.setHeader('Content-Type', 'text/plain'); res.end('未找到请求的资源'); }});

server.listen(3000, ()=> { console.log('服务器运行在 http://localhost:3000');});

现在我们已经大致了解了node 的基本工作原理,现在来实现一个系统的功能 读取文件或者文件夹

采坑记录

中文输出乱码问题

res.statusCode = 200 res.setHeader('Content-Type', 'text/plain') res.end('啊啊和嘎哈啊')

输出中出现中文乱码 附解决方案 ~

res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' })

res.writeHead(200, { 'Context-Type': 'text/plain' }) res.write('<head><meta charset="utf-8"/></head>')

文件读取方式

node 允许通过两种方式读取并输出文件

one : 以文件流的形式读取与返回一起进行,快 = 推荐

fs.createReadStream(filePath).pipe(res)

two : 先将文件整个读取,然后将文件内容一起返回,简单说这就是api的蹩脚使用 = 慢

fs.readFile(filePath, (err, data) => { if (err) return res.end(data) })

读取文件或者文件夹

废话不说,上代码

require('./config/defaultConfig') 更新为以下

module.exports = { // 主机名称 hostname: '127.0.0.1', // 端口号 port: 6969, // 当前文件夹 root: process.cwd() }

// 引入 ${conf.hostname}:${conf.port}` console.info(`server startd at ${chalk.green(addr)}`) })

代码优化

上述代码存在很多回调,代码臃肿可读性差。下面利用异步将回调去除,达到优化效果

require-atomic-updates 注意eslint对于此项的限制, 为此将实参await

const fs = require('fs') const promisify = require('util').promisify const stat = promisify(fs.stat) const readdir = promisify(fs.readdir) module.exports = async function(rep, res, filePath) { // 规避此问题require-atomic-updates报告在异步函数中重新分配变量时可能发生的竞争条件错误 const awaitRes = await res awaitRes.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' }) try { const stats = await stat(filePath) if (stats.isFile()) { // 如果是文件 返回文件内容 awaitRes.statusCode = 200 fs.createReadStream(filePath).pipe(awaitRes) } else if (stats.isDirectory()) { // 如果是文件夹,返回文件列表 const file = readdir(filePath) awaitRes.statusCode = 200 awaitRes.end(file.join(',')) } } catch (ex) { // 状态码 awaitRes.statusCode = 404 // 找不到提示文本 awaitRes.end(`${filePath} is 404`) } }

app.js文件变更为

// 引入 ${conf.hostname}:${conf.port}` console.info(`server startd at ${chalk.green(addr)}`) })

至此实现了通过hash路径输入,实现文件或文件夹的读取/前进后退

如何将Node静态服务器改写为支持长尾词查询的文件或文件夹读取功能?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。