1、nodejs寫伺服器怎麼樣
<
2、nodejs 適合做文件伺服器嗎
一般可以選擇nodejs來做靜態文件伺服器。具體參考如下:
assets放置網站的靜態文件css,js,img等;common存放項目的配置文件和一些通用文件;server存放服務處理文件,將要創建的靜態文件服務就是放在此目錄中; tpl放置的是模板文件也就是網頁文件。
文件的下載格式主要是由'Content-Type'的值決定的,要想下載的文件能夠正常工作就應該正確的設置不同文件的'Content-Type'值。mime.js文件存放了一些常用mime值:
[javascript] view plain copy
exports.mime = {
"html" : "text/html",
"css" : "text/css",
"js" : "text/javascript",
"json" : "application/json",
"ico" : "image/x-icon",
"gif" : "image/gif",
"jpeg" : "image/jpeg",
"jpg" : "image/jpeg",
"png" : "image/png",
"pdf" : "application/pdf",
"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"
};
先來看server.js和FServer.js的類容:
[javascript] view plain copy
// server.js
var config = require('./common/config');
var http = require('http');
var fs = require('fs');
var url = require('url');
var path = require('path');
var FServer = require('./server/FServer');
function index(){
var indexPath = config.ui + '/index.html';
fs.exists(indexPath, function(exists){
if( !exists ) {
throw err;
} else {
fs.readFile(indexPath, function(err, data){
if (err) {
throw err;
} else {
function onRequest(req, res){
// 取得文件路徑
var pathname = url.parse(req.url).pathname;
// 獲取文件擴展名(包含前置.)
var extname = path.extname( pathname );
var type = extname.slice(1);
// 獲取下載文件在磁碟上的路徑,
var realPath = config.root + pathname;
if ( extname === '' ) {
res.writeHead(200, {'Content-Type':'text/html'});
res.write(data);
res.end();
} else {
FServer.filesLoad(realPath, type, req, res);
}
}
http.createServer(onRequest).listen(config.port);
}
})
}
})
}
exports.index = index;
// FServer.js
var fs = require('fs');
var mime = require('../common/mime').mime;
function filesLoad(filePath, type, req, res){
fs.exists(filePath, function(exists){
if ( !exists ) {
res.writeHead(404, {'Content-Type': 'text/plain'});
// res.write();
res.end();
} else {
fs.readFile(filePath, 'binary', function(err, file){
if ( err ) {
res.writeHead(500, {'Content-Type': 'text/plain'});
// res.write();
res.end();
} else {
res.writeHead(200, {'Content-Type': mime[type]});
res.write(file, 'binary');
res.end();
}
});
}
})
}
exports.filesLoad = filesLoad;
上面引入了nodejs的內置模塊http、fs、url、path,config和FServer是自定義模塊,要讀取文件首先要知道文件在磁碟上是否存在,還應當知道文件的類型才能達到想要的效果。運行程序可以發現css和javascript都下載正確,並且css效果在頁面上正確渲染(javascript還沒有寫效果)
3、如何訪問nodejs伺服器上的文件
伺服器推薦用nginx,配置簡單,性能強悍。nginx可以使用代理訪問後端的Node.js應用伺服器。配置方法:1)在配置文件http段內容添加後端伺服器:http{#添加後端伺服器,和nginx負載均衡配置一樣upstreamnodejs{server127.0.0.1:8080;}}2)給應用添加虛擬主機:server{listen80;server_nameIPlocation/{proxy_passnodejs;#名字和前面的對應,將所有的請求轉發給後端的node}access_loglogs/nodejs.access.logmain;#如果需要日誌的話}推薦將靜態文件如css、js和圖片和應用伺服器分開。
4、nodejs怎麼部署到伺服器上
伺服器推薦用nginx,配置簡單,性能強悍。
nginx可以使用代理訪問後端的Node.js應用伺服器。
配置方法:
1)在配置文件http段內容添加後端伺服器:
http {
#添加後端伺服器,和nginx負載均衡配置一樣
upstream nodejs {
server 127.0.0.1:8080;
}
...
}
2)給應用添加虛擬主機:
server {
listen 80;
server_nameIP
location / {
proxy_pass nodejs;#名字和前面的對應,將所有的請求轉發給後端的node
}
access_log logs/nodejs.access.log main;#如果需要日誌的話
}
推薦將靜態文件如css、js和圖片和應用伺服器分開。
5、如何用用命令行開啟nodejs搭建web伺服器
您好 很高興為您解答:
這個web伺服器包括三塊,app.js是程序入口,負責響應url請求;route.js是路由,用來分發處理復雜的業務邏輯;system.js是配置文件,用來配置伺服器參數,如host、port等
首先來看app.js,引用模塊,http處理url請求,url用來解析請求參數和路徑,path只是用來匹配路徑的擴展名o(╯□╰)o,fs用來讀取本地靜態文件,剩下兩個模塊後面詳解。
接下來正式創建伺服器處理請求,請求大致分兩類,一類是靜態文件,如xxx.html、xxx.js等等,另一類是進行業務處理,如常見的增刪查改操作,這一部分操作交給路由處理,這里用了一個簡單的判斷邏輯:通過後綴名,後綴名在system.js中配置。
讀取本地文件的時候要注意一點,那就是緩存。如果客戶端發出重復請求,伺服器需要判斷文件自上次請求後是否發生了修改,如果未修改返回304,這樣可以加快瀏覽器端的響應速度。這里的判斷方式是通過判斷請求的header的if-modified-since時間和本地文件修改時間是否一致,如果一致則返回304,否則重置該時間,第一張圖是代碼,第二張圖是通過chrome調試工具看到的請求頭部時間。
如果需要進行業務處理,則交給路由處理了。首先路由引入具體的業務邏輯模塊,然後通過解析具體的路徑名來執行具體的業務邏輯,這里注意的是:由於node.js的並發特性,記得傳入回調函數來獲得相應的處理結果。
望採納 謝謝
6、伺服器部署nodejs的幾種方法
由於自身特性的原因。node程序必須保持開啟才能訪問網站,而當我們關閉SSH時這些進程都會被停止。有以下3種方法可以避免這個問題。
screen
Screen,虛擬終端管理器。可以在後台管理終端界面,防止SSH斷開以後任務停止運行。
安裝方法:
sudo apt-get screen (以ubuntu為例)
使用方法:
使用screen -S [任意id]命令進入一個名為id的終端,此時便可以隨意執行操作
例如執行sudo apt-get upgrade,或者其它消耗時間比較長的工作,像編譯內核等等。
按ctrl+a後再按d保存虛擬終端,系統提示deatached即為保存成功
接下來可以斷開SSH終端,虛擬終端仍會執行。
訪問已經創建好的終端
screen -ls 列出已經創建的正在後台運行的終端
screen -r xxx 進入終端
例如 screen -r terminal1
徹底退出
screen -r 進入終端後執行exit即可完全退出
PM2
pm2 是一個帶有負載均衡功能的Node應用的進程管理器.當你要把你的獨立代碼利用全部的伺服器上的所有CPU,並保證進程永遠都活著
安裝方法
npm install -g pm2
使用方法
啟動應用 pm2 start -watch app.js
重啟應用 pm2 restart app.js
顯示進程列表 pm2 list
停止某應用 pm2 stop app_name|app_id
停止所有應用 pm2 stop all
小白方案
個人目前用的是寶塔Linux面板,可以說是把Linux的各種操作都已比較簡單的形式展現出來了,不需要什麼Linux知識就能掌握 寶塔官網了解一下
而這其中內置了PM2管理,裝一下就OK了
7、如何通過輸入域名訪問部署在本機的nodejs伺服器
通過復輸入域名訪問部制署在本機的nodejs伺服器方法:
修改系統的hosts文件就可以了,比如(想用的域名為:myapp.com,前面加上www.):
node伺服器的host為:localhost,埠(port):8080;
修改系統hosts文件,在末尾加一行代碼:127.0.0.1 myapp.com,前面加上www. 然後保存。
在瀏覽器輸入:myapp.com:8080,前面加上www. 即可訪問(前提是項目node伺服器正在運行,沒運行會失敗);
8、如何使用 NodeJS 將文件或圖像上傳到伺服器
下面先介紹上傳文件到伺服器(多文件上傳):
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import java.util.regex.*;
import org.apache.commons.fileupload.*;
public class upload extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GB2312";
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out=response.getWriter();
try {
DiskFileUpload fu = new DiskFileUpload();
// 設置允許用戶上傳文件大小,單位:位元組,這里設為2m
fu.setSizeMax(2*1024*1024);
// 設置最多隻允許在內存中存儲的數據,單位:位元組
fu.setSizeThreshold(4096);
// 設置一旦文件大小超過getSizeThreshold()的值時數據存放在硬碟的目錄
fu.setRepositoryPath("c://windows//temp");
//開始讀取上傳信息
List fileItems = fu.parseRequest(request);
// 依次處理每個上傳的文件
Iterator iter = fileItems.iterator();
//正則匹配,過濾路徑取文件名
String regExp=".+////(.+)$";
//過濾掉的文件類型
String[] errorType={".exe",".com",".cgi",".asp"};
Pattern p = Pattern.compile(regExp);
while (iter.hasNext()) {
FileItem item = (FileItem)iter.next();
//忽略其他不是文件域的所有表單信息
if (!item.isFormField()) {
String name = item.getName();
long size = item.getSize();
if((name==null||name.equals("")) && size==0)
continue;
Matcher m = p.matcher(name);
boolean result = m.find();
if (result){
for (int temp=0;temp<ERRORTYPE.LENGTH;TEMP++){
if (m.group(1).endsWith(errorType[temp])){
throw new IOException(name+": wrong type");
}
}
try{
//保存上傳的文件到指定的目錄
//在下文中上傳文件至資料庫時,將對這里改寫
item.write(new File("d://" + m.group(1)));
out.print(name+" "+size+"");
}
catch(Exception e){
out.println(e);
}
}
else
{
throw new IOException("fail to upload");
}
}
}
}
catch (IOException e){
out.println(e);
}
catch (FileUploadException e){
out.println(e);
}
}
}
現在介紹上傳文件到伺服器,下面只寫出相關代碼:
以sql2000為例,表結構如下:
欄位名:name filecode
類型: varchar image
資料庫插入代碼為:PreparedStatement pstmt=conn.prepareStatement("insert into test values(?,?)");
代碼如下:
。。。。。。
try{
這段代碼如果不去掉,將一同寫入到伺服器中
//item.write(new File("d://" + m.group(1)));
int byteread=0;
//讀取輸入流,也就是上傳的文件內容
InputStream inStream=item.getInputStream();
pstmt.setString(1,m.group(1));
pstmt.setBinaryStream(2,inStream,(int)size);
pstmt.executeUpdate();
inStream.close();
out.println(name+" "+size+" ");
}
。。。。。。
這樣就實現了上傳文件至資料庫
9、如何在創建的nodejs伺服器下運行html
首先實現一個處理靜態資源的函數,其實就是對本地文件的讀取操作,這個方法已滿足了上面說的靜態資源的處理。
//處理靜態資源
function staticResHandler(localPath, ext, response) {
fs.readFile(localPath, "binary", function (error, file) {
if (error) {
response.writeHead(500, { "Content-Type": "text/plain" });
response.end("Server Error:" + error);
} else {
response.writeHead(200, { "Content-Type": getContentTypeByExt(ext) });
response.end(file, "binary");
}
});
}
10、怎麼用nodejs搭建web伺服器
使用Nodejs搭建Web伺服器是學習Node.js比較全面的入門教程,因為要完成一個簡單的Web伺服器,你需要學習Nodejs中幾個比較重要的模塊,比如:http協議模塊、文件系統、url解析模塊、路徑解析模塊、以及301重定向問題,下面我們就簡單講一下如何來搭建一個簡單的Web伺服器。
作為一個Web伺服器應具備以下幾個功能:
1、能顯示以.html/.htm結尾的Web頁面
2、能直接打開以.js/.css/.json/.text結尾的文件內容
3、顯示圖片資源
4、自動下載以.apk/.docx/.zip結尾的文件
5、形如http://xxx.com/a/b/ , 則查找b目錄下是否有index.html,如果有就顯示,如果沒有就列出該目錄下的所有文件及文件夾,並可以進一步訪問。
6、形如http://xxx.com/a/b, 則作301重定向到http://xxx.com/a/b/ , 這樣可以解決內部資源引用錯位的問題。
引入需要用到的幾個模塊:
//http協議模塊
var http = require('http');
//url解析模塊
var url = require('url');
//文件系統模塊
var fs = require("fs");
//路徑解析模塊
var path = require("path");
創建服務並在指定的埠監聽:
//創建一個服務
var httpServer = http.createServer(this.processRequest.bind(this));
//在指定的埠監聽服務
httpServer.listen(port,function(){
console.log("[HttpServer][Start]","runing at http://"+ip+":"+port+"/");
console.timeEnd("[HttpServer][Start]");
});
在創建服務的時候需要傳遞一個匿名函數processRequest 對請求進行處理,processRequest接收2個參數,分別是request和response, request對象中包含了請求的所有內容,request是用來設置響應頭以及對客戶端做出響應操作。
processRequest:function(request,response){
var hasExt = true;
var requestUrl = request.url;
var pathName = url.parse(requestUrl).pathname;
//對請求的路徑進行解碼,防止中文亂碼
pathName = decodeURI(pathName);
//如果路徑中沒有擴展名
if(path.extname(pathName) === ''){
//如果不是以/結尾的,加/並作301重定向
if (pathName.charAt(pathName.length-1) != "/"){
pathName += "/";
var redirect = "http://"+request.headers.host + pathName;
response.writeHead(301, {
location:redirect
});
response.end();
}
//添加默認的訪問頁面,但這個頁面不一定存在,後面會處理
pathName += "index.html";
hasExt = false; //標記默認頁面是程序自動添加的
}
//獲取資源文件的相對路徑
var filePath = path.join("http/webroot",pathName);
//獲取對應文件的文檔類型
var contentType = this.getContentType(filePath);
//如果文件名存在
fs.exists(filePath,function(exists){
if(exists){
response.writeHead(200, {"content-type":contentType});
var stream = fs.createReadStream(filePath,{flags:"r",encoding:null});
stream.on("error", function() {
response.writeHead(500,{"content-type": "text/html"});
response.end("<h1>500 Server Error</h1>");
});
//返迴文件內容
stream.pipe(response);
}else { //文件名不存在的情況
if(hasExt){
//如果這個文件不是程序自動添加的,直接返回404
response.writeHead(404, {"content-type": "text/html"});
response.end("<h1>404 Not Found</h1>");
}else {
//如果文件是程序自動添加的且不存在,則表示用戶希望訪問的是該目錄下的文件列表
var html = "<head><meta charset='utf-8'></head>";
try{
//用戶訪問目錄
var filedir = filePath.substring(0,filePath.lastIndexOf('\\'));
//獲取用戶訪問路徑下的文件列表
var files = fs.readdirSync(filedir);
//將訪問路徑下的所以文件一一列舉出來,並添加超鏈接,以便用戶進一步訪問
for(var i in files){
var filename = files[i];
html += "<div><a href='"+filename+"'>"+filename+"</a></div>";
}
}catch (e){
html += "<h1>您訪問的目錄不存在</h1>"
}
response.writeHead(200, {"content-type": "text/html"});
response.end(html);
}
}
});
},
請求處理函數中有幾個重點需要說一下:
對於路徑中有中文的,瀏覽器會自動進行編碼(英文不變,中文會變),因此在接收到地址後,需要對地址進行解碼,否則最後得到的路徑和真實路徑不相符,
當訪問路徑不是以具體的文件結尾,並且不是以/結尾,則需要通過重定向加上/,表示當前目錄,否則當前路徑下的靜態資源會找不到
如果訪問路徑是目錄,則列出該目錄下所有文件及文件夾,並可以點擊訪問,為了讓中文目錄能正常顯示,則還要在header中設置charset=utf-8