alreadynode

利用node简单模拟Apache服务器获取不同目录下的文件数据

2022-03-07  本文已影响0人  听书先生

node的服务器路径跟物理文件没有绝对映射关系,但是node可以相对于apache服务器更加灵活的去创建。

可以利用简单的文件流的读取去模拟获取JSON数据,但是这个会存在问题。

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

http.createServer((req,res) => {
   fs.readFile('./public/news.json', (error, data) => {
      if (error) {
        throw error;
      } 
      res.end(data)
   })
}).listen(3000, () => console.log('Server port start ....'));

需要做到的是:服务器指明文件类型,也就是MIME。 MIME:文件后缀名和文件类型的映射表
我们在public目录下创建两个文件夹,一个为商品goods,一个为新闻news。

图1.png
const http = require('http');
const fs = require('fs');
const url = require('url');
const path = require('path');

let MIME = {
  ".html": "text/html;charset=utf8",
  ".css": "text.css",
  ".jpg": "image/jpeg",
  ".gif": "image/gif",
  ".png": "image/png",
  ".js": "application/x-javascript",
  ".json": "text/json"
}

http.createServer((req, res) => {
   // 1. 获取用户的url路径
   let pathname = url.parse(req.url).pathname;
   let extname = path.extname(pathname);
   // 2. 通过node模拟Apache路径的映射关系     
   fs.readFile('./public' + pathname, (error, data) => {
     if (error) {
        // 防止出现乱码
        res.setHeader('Content-Type', 'text/html;charset=utf8');
        res.end('404, 页面不存在');
        return;
     }
     // 根据MIME映射表去判断文件后缀名去设置对应的请求头
     res.setHeader('Content-Type', MIME[extname])
     res.end(data)
   })
}).listen(3000, () => console.log('Server port start ....'));

终端cd到指定目录,执行node代码

图2.png
但是MIME表是可能存在文件拓展名不存在表中映射关系的,因此需要借用hasOwnProperty方法来判断属性是否是该对象中的。
// 根据MIME映射表去判断文件后缀名去设置对应的请求头
if (MIME.hasOwnProperty(extname)) {
   res.setHeader('Content-Type', MIME[extname])
}
上一篇下一篇

猜你喜欢

热点阅读