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 ...
随机推荐
- Cannot find or open the PDB file
打开VS:工具 --> 选项 --> 调试-->符号接下来就是选择Microsoft,然后确认
- HMAC算法及其应用
HMAC算法及其应用 MAC HMAC HMAC的应用 HMAC实现举例 MAC 在现代的网络中,身份认证是一个经常会用到的功能,在身份认证过程中,有很多种方式可以保证用户信息的安全,而MAC(mes ...
- 用C++模拟蚊子的运动来检验概率论内容
背景:在一个很大的方形透明容器内,从某个位置放入适量的蚊子,等待几分钟后观察蚊子的分布. #include <iostream> #include <cstdlib> #inc ...
- Crash日志解析
当应用程序崩溃时,会创建一个崩溃报告,这对于了解导致崩溃的原因非常有用.本文档包含有关如何表示,理解和解释崩溃报告的基本信息. 1.介绍 2.获取崩溃和低内存报告 3.象征性的奔溃报告 1.位码(bi ...
- Acmer 仅以此纪念最痛苦的一天
今天打比赛,完全不在状态,看到别人又AK了,自己心里真TM不是个滋味,我为什么这么弱,菜鸡,每天都在水题,我的人生也是这么水?伪学习?没有学习能力,这不只是队伍的问题,是自己的问题,别人平均3题我们队 ...
- CodeForces - 1245F Daniel and Spring Cleaning (数位DP)
While doing some spring cleaning, Daniel found an old calculator that he loves so much. However, it ...
- Integer和int及String的总结
秉承着总结发表是最好的记忆,我把之前遇到的问题在这里总结和大家分享一下,希望大家共同进步: 一.Integer和int首先说下自动拆装箱,基本数据类型转换为包装类型的过程叫装箱,反之则是拆箱,其中最特 ...
- Java——一文读懂Spring MVC执行流程
说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图: Sp ...
- Android下拉刷新SwipeRefreshLayout简单用法
之前一直都想用下拉刷新,感觉上是庞大的工程,所以搁置了.现在学习了一下其实真的超级简单. 看了<第一行代码>以及 https://www.jianshu.com/p/3c402a9e4b7 ...
- NetCore项目实战篇05---添加Ocelot网关并集成identity server4认证
今天来给我们的项目增加API网关,使用Ocelot. 它是系统暴露在外部的一个访问入口,这个有点像代理访问的家伙,就像一个公司的门卫承担着寻址.限制进入.安全检查.位置引导.等等功能.同时我们还要在网 ...