nodejs server启动写法
http://www.phpstudy.net/c.php/18720.html
node不利用框架怎么实现对静态HTML、css、js的服务?
初学nodeJS,在使用nodejs构建静态文件服务器的时候,遇到下面问题。
用户请求index.html时,我使用fs.readFile读取index.html并将data返回,代码如下: function serverStatic(req,res){
var filePath;
if(req.url==="/"){
filePath = "index.html";
} else{
filePath = "./" + url.parse(req.url).pathname;
} fs.exists(filePath,function(err){
if(err){
send404(res);
}else{
fs.readFile(filePath,function(err,data){
if(err){
res.end("<h1>500</h1>服务器内部错误!");
}else{
res.writeHead(200,{'content-type':'text/html'});
res.end(data.toString());
}
});//fs.readfile
}
})//path.exists }//serverStatic
那么问题来了,如果我的HTML页面引用了外部的css或者js,那么这些外部文件不会被加载···
这个问题怎么解决? 尝试:
index源码: <!doctype html>
<html>
<head>
<meta charset='utf-8'>
<link href="css/index.css">
</head>
<body>
<a href="flexbox.html">看看伸缩盒?</a>
</body>
</html>
css: body{background-color:red;} app.js: var http=require('http');
var fs=require('fs');
var url=require('url');
var path=require('path');
var PORT=9090;
//添加MIME类型
var MIME_TYPE = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"pdf": "application/pdf",
"png": "image/png",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tiff": "image/tiff",
"txt": "text/plain",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"xml": "text/xml"
}; var server = http.createServer(serverStatic);
function serverStatic(req,res){
var filePath;
if(req.url==="/"){
filePath = "index.html";
} else{
filePath = "./" + url.parse(req.url).pathname;
} fs.exists(filePath,function(err){
if(!err){
send404(res);
}else{
var ext = path.extname(filePath);
ext = ext?ext.slice(1) : 'unknown';
var contentType = MIME_TYPE[ext] || "text/plain";
fs.readFile(filePath,function(err,data){
if(err){
res.end("<h1>500</h1>服务器内部错误!");
}else{
res.writeHead(200,{'content-type':contentType});
res.end(data.toString());
}
});//fs.readfile
}
})//path.exists } server.listen(PORT);
console.log("Server runing at port: " + PORT + "."); function send404(res){
res.end("<h1>404</h1><p>file not found</p>")
}
chrome查看网络: 我的文件结构 那么问题来了,你的为请求的每个资源写读取文件处理 前几天刚有人问这个问题的
http://.com/q/1010000004317668?_ea=567469
利用nodejs搭建静态文件服务器 下面是一个静态文件访问的模块 /**
* 引入模块
* @type {[type]}
*/
var fs =require("fs");
var mime =require("mime");
var path =require("path"); /*******************************************************************************************/ /**
* [Send 创建发送响应对象]
*/
function Send(){};
Send.prototype.cache={};//设置缓存变量,因为缓存变量比读取文件要快 /**
* 错误404页面
* @param {[type]} res [description]
* @return {[type]} [description]
*/
Send.prototype.err404 = function(res){
res.writeHead(404,{"Content-Type":"text/plain"});
res.write("404 Not Fount !");
res.end();
}; /**
* 正确访问页面
* @param {[type]} res [description]
* @param {[type]} fileName [description]
* @param {[type]} fileContent [description]
* @return {[type]} [description]
*/
Send.prototype.sendFile = function(res,fileName,fileContent){
res.writeHead(200,{"Content-Type":mime.lookup(path.basename(fileName))});
res.end(fileContent); }; /**
* 发送静态页面方法
* @param {[type]} res [description]
* @param {[type]} absPath [description]
* @return {[type]} [description]
*/
Send.prototype.serveStatic = function(res,absPath){
var _this=this;
if(this.cache[absPath]){
this.sendFile(res,absPath,this.cache[absPath]);
}else{
fs.exists(absPath,function(exists){
if(exists){
fs.readFile(absPath,function(err,data){
if(err){
_this.err404(res);
}else{
_this.sendFile(res,absPath,data);
}
})
}else{
_this.err404(res);
}
}) }
}; Send.prototype.staticDirectory=function(req,url){
var filePath=false;
if(new RegExp("^/"+url+"/.*").test(req.url)){
filePath=url+req.url;
}
var absPath="./"+filePath; return absPath; } /*******************************************************************************************/ module.exports=Send; 调用方法 /**
* 引入HTTP组建,创建HTTP服务器的核心组件
* @type {[type]}
*/
var http=require("http");
var sio=require("socket.io"); /**
* 引入自定义组件,
* @type {[type]}
*/
var staticService=require("./modules/staticService"); /*************************************************/ /**
* 创建http服务
* @param {[type]} req [description]
* @param {[type]} res){ var filePath [description]
* @return {[type]} [description]
*/
var server = http.createServer(function(req,res){
var send=new staticService();
var absPath=send.staticDirectory(req,"public")
send.serveStatic(res,absPath);
}); server.listen(8200,function(){
console.log("Http server create success on : localhost:8200");
}) fs.exists(filePath,function(err)
如果文件存在,回掉函数的第1个参数为true var http=require('http');
var fs=require('fs');
var url=require('url');
var path=require('path');
var PORT=9090;
//添加MIME类型
var MIME_TYPE = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"json": "application/json",
"pdf": "application/pdf",
"png": "image/png",
"svg": "image/svg+xml",
"swf": "application/x-shockwave-flash",
"tiff": "image/tiff",
"txt": "text/plain",
"wav": "audio/x-wav",
"wma": "audio/x-ms-wma",
"wmv": "video/x-ms-wmv",
"xml": "text/xml"
}; var server = http.createServer(serverStatic);
function serverStatic(req,res){
var filePath;
if(req.url==="/"){
filePath = "CSSTest.html";
} else{
filePath = "./" + url.parse(req.url).pathname;
} fs.exists(filePath,function(err){
if(!err){
send404(res);
}else{
var ext = path.extname(filePath);
ext = ext?ext.slice(1) : 'unknown';
var contentType = MIME_TYPE[ext] || "text/plain";
fs.readFile(filePath,function(err,data){
if(err){
res.end("<h1>500</h1>服务器内部错误!");
}else{
res.writeHead(200,{'content-type':contentType});
res.end(data.toString());
}
});//fs.readfile
}
})//path.exists } server.listen(PORT);
console.log("Server runing at port: " + PORT + ".");
问题已解决,link css的时候,不能忘了 rel="stylesheet"
nodejs server启动写法的更多相关文章
- SQL Server启动的几种方法
SQL Server 启动有以下几种方法: (1)在Control Panel——Administrative Tools——Services,找到SQL Server (XXX)进行启动. 其中XX ...
- Eclipse导入Maven项目,使用server 启动报错,class 找不到,
问题发现: 1.导入maven 项目后,用server 启动,选择项中没有这个项目 解决: 说明server 没有把该项目当成web项目,需要设置 项目右键 properties ---- proj ...
- dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法
dell r710 安装ubuntu 12.04 server 启动后进入initramfs解决办法 grub 启动菜单后加入 rootdelay=90, 如下:/boot/vmlinuz-2.6.3 ...
- 用issnode+IIS来托管NodeJs Server
用issnode+IIS来托管NodeJs Server之一:安装篇 用issnode+IIS来托管NodeJs Server之二:移植 用issnode+IIS来托管NodeJs Server之三: ...
- 图解Android - Zygote, System Server 启动分析
Init 是所有Linux程序的起点,而Zygote于Android,正如它的英文意思,是所有java程序的'孵化池'(玩过星际虫族的兄弟都晓得的).用ps 输出可以看到 >adb shell ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系 ...
- VisualSVN Server启动错误(0x8007042a)
SVN Server启动错误(0x8007042a) 原因是SVN Server端口被占用 打开VisualSVN Server, 菜单->操作->Properties->Net ...
- Netty源码—一、server启动(1)
Netty作为一个Java生态中的网络组件有着举足轻重的位置,各种开源中间件都使用Netty进行网络通信,比如Dubbo.RocketMQ.可以说Netty是对Java NIO的封装,比如ByteBu ...
- SQL SERVER启动步骤
第一步 从注册表读取SQL SERVER启动信息 (1)Audit Level:设置SQL SERVER是否记录用户登陆信息 Login Mode:设置SQL SERVER登陆类型是只接受windo ...
随机推荐
- 2019-2020-1 20199329《Linux内核原理与分析》第八周作业
<Linux内核原理与分析>第八周作业 一.本周内容概述: 理解编译链接的过程和ELF可执行文件格式 编程练习动态链接库的两种使用方式 使用gdb跟踪分析一个execve系统调用内核处理函 ...
- tagbar 调到函数定义再跳回
首先要在源码文件夹下执行 ctags -R * 生成tags文件 齐次要安装 YouCompleteMe ctrl + ] 跳到函数定义 Ctrl-o 和 Ctrl-I 跳回.我试验的只有 Ctrl- ...
- [Hands-on-Machine-Learning-master] 02 Housing
用到的函数 numpy.random.permutation随机排列一个序列,返回一个排列的序列. >>> np.random.permutation(10) array([1, 7 ...
- MATLAB学习1 之画图函数
ezplot适用条件 "ezplot"命令可以用于显函数.隐函数和参数方程作图. 不同函数的使用格式 显函数y=f(x),ezplot函数的调用格式为ezplot(f, [xmin ...
- qemu-img压缩磁盘操作
2019独角兽企业重金招聘Python工程师标准>>> qemu-img convert -c -f qcow2 -O qcow2 /data/data1.disk /opt/dat ...
- MySQL 子查询——查询最大值
子查询指将一个查询语句嵌套在另一个查询语句中.子查询可以在 SELECT.UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套.在实际开发时,子查询经常出现在 WHERE 子句中.子查询在 ...
- P1620 漂亮字串
\(核心思路就是分情况讨论\) 从整体上对题目进行分析,此题共有三种情况: (1)0 有一方为0,则结果为另一方的max: 两方都为0,则结果为0: (2)一方多,另一方不够用,满足\((contx+ ...
- mybatis与hibernate运行流程比较
hibernate长时间没用,感觉生疏了,正好借这篇文章整合下知识,顺便复习比较下两种框架. 概述: Mybatis和hibernate不同,它不完全是一个ORM框架,因为MyBatis需要程序员自己 ...
- Coursera课程笔记----计算导论与C语言基础----Week 12
期末编程测试(Week 12) Quiz1 判断闰年 #include <iostream> using namespace std; int main() { int year; cin ...
- 【FPGA篇章二】FPGA开发流程:详述每一环节的物理含义和实现目标
欢迎大家关注我的微信公众账号,支持程序媛写出更多优秀的文章 FPGA的开发流程是遵循着ASIC的开发流程发展的,发展到目前为止,FPGA的开发流程总体按照下图进行,有些步骤可能由于其在当前项目中的条件 ...