如何在 node.js 服务器上加载图像?
How do I load an image on a node.js server?
我想加载 node.js 文件中的图像。但是,当我尝试 fs.readfile 时,如果在服务器 运行 之后没有图像文件,它就会出错。但是,当我启动我的服务器时,图像会被下载并显示并正常工作。
当我保留服务器 运行 并删除图像并尝试刷新页面,希望图像将被重新下载并仍然显示时,它在 fs.readfile 上出错,因为图像文件不存在,因为如果删除它不会重新下载。
如何使网页动态化以便在我刷新 localhost:1337 时每次都会下载图像,而不是仅在服务器启动时下载?
到目前为止,这是我的代码。
//Dilbert Comic Server
var http = require('http'),
fs = require('fs'),
request = require('request'),
url = require('url'),
cheerio = require('cheerio'),
request = require('request'),
DilbertURL = 'http://Dilbert.com/strip/' + getDateTime();
http.createServer(function (req, res)
{
var img = fs.readFileSync('./Dilbert.jpg');
res.writeHead(200, {'Content-Type': 'image/gif' });
res.end(img, 'binary');
console.log('Server running at http://127.0.0.1:1337/');
}).listen(1337, '127.0.0.1');
request(DilbertURL, function (error, response, body) {
var $ = cheerio.load(body);
$('div.container-fluid').each(function(i, element){
var src = $('.img-responsive.img-comic').attr("src");
download(src, 'Dilbert.jpg', function()
{
console.log('Image downloaded');
});
});
});
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
console.log('content-type:', res.headers['content-type']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
function getDateTime() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
month = (month < 10 ? "0" : "") + month;
var day = date.getDate();
day = (day < 10 ? "0" : "") + day;
return year + "-" + month + "-" + day ;
}
我是 Node.js 的新手,所以请多多包涵。
你的代码现在的问题是你在所谓的全局范围内下载图片,所以当 Node.JS 加载文件并读取所有代码时,它会看到该函数并将运行 就一次。要完成您想完成的事情(让服务器每次都下载图片),您必须将下载函数放在 Web 服务器收到请求时执行的函数中,如下所示:
//Dilbert Comic Server
var http = require('http'),
fs = require('fs'),
request = require('request'),
url = require('url'),
cheerio = require('cheerio'),
DilbertURL = 'http://dilbert.com/strip/' + getDateTime();
http.createServer(function(req, res) {
request(DilbertURL, function(error, response, body) {
var $ = cheerio.load(body);
$('div.container-fluid').each(function(i, element) {
var src = $('.img-responsive.img-comic').attr("src");
download(src, 'Dilbert.jpg', function() {
var img = fs.readFileSync('./Dilbert.jpg');
res.writeHead(200, {
'Content-Type': 'image/gif'
});
res.end(img, 'binary');
});
});
});
}).listen(1337, '127.0.0.1', function(err){
if(err){
console.log("Failed to start web server:", err);
}else{
console.log('Server running at http://127.0.0.1:1337/');
}
});
var download = function(uri, filename, callback) {
request.head(uri, function(err, res, body) {
console.log('content-type:', res.headers['content-type']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
function getDateTime() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
month = (month < 10 ? "0" : "") + month;
var day = date.getDate();
day = (day < 10 ? "0" : "") + day;
return year + "-" + month + "-" + day ;
}
注意:我通过执行以下修复稍微清理了您的代码:
1) 你两次设置请求变量,所以我删除了第二个。
2) 每次服务器收到请求时,您都打印出 'Server running..' 字符串,所以我在服务器启动时打印出来,没有出现错误。
欢迎来到Node.JS!
我想加载 node.js 文件中的图像。但是,当我尝试 fs.readfile 时,如果在服务器 运行 之后没有图像文件,它就会出错。但是,当我启动我的服务器时,图像会被下载并显示并正常工作。
当我保留服务器 运行 并删除图像并尝试刷新页面,希望图像将被重新下载并仍然显示时,它在 fs.readfile 上出错,因为图像文件不存在,因为如果删除它不会重新下载。
如何使网页动态化以便在我刷新 localhost:1337 时每次都会下载图像,而不是仅在服务器启动时下载?
到目前为止,这是我的代码。
//Dilbert Comic Server
var http = require('http'),
fs = require('fs'),
request = require('request'),
url = require('url'),
cheerio = require('cheerio'),
request = require('request'),
DilbertURL = 'http://Dilbert.com/strip/' + getDateTime();
http.createServer(function (req, res)
{
var img = fs.readFileSync('./Dilbert.jpg');
res.writeHead(200, {'Content-Type': 'image/gif' });
res.end(img, 'binary');
console.log('Server running at http://127.0.0.1:1337/');
}).listen(1337, '127.0.0.1');
request(DilbertURL, function (error, response, body) {
var $ = cheerio.load(body);
$('div.container-fluid').each(function(i, element){
var src = $('.img-responsive.img-comic').attr("src");
download(src, 'Dilbert.jpg', function()
{
console.log('Image downloaded');
});
});
});
var download = function(uri, filename, callback){
request.head(uri, function(err, res, body){
console.log('content-type:', res.headers['content-type']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
function getDateTime() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
month = (month < 10 ? "0" : "") + month;
var day = date.getDate();
day = (day < 10 ? "0" : "") + day;
return year + "-" + month + "-" + day ;
}
我是 Node.js 的新手,所以请多多包涵。
你的代码现在的问题是你在所谓的全局范围内下载图片,所以当 Node.JS 加载文件并读取所有代码时,它会看到该函数并将运行 就一次。要完成您想完成的事情(让服务器每次都下载图片),您必须将下载函数放在 Web 服务器收到请求时执行的函数中,如下所示:
//Dilbert Comic Server
var http = require('http'),
fs = require('fs'),
request = require('request'),
url = require('url'),
cheerio = require('cheerio'),
DilbertURL = 'http://dilbert.com/strip/' + getDateTime();
http.createServer(function(req, res) {
request(DilbertURL, function(error, response, body) {
var $ = cheerio.load(body);
$('div.container-fluid').each(function(i, element) {
var src = $('.img-responsive.img-comic').attr("src");
download(src, 'Dilbert.jpg', function() {
var img = fs.readFileSync('./Dilbert.jpg');
res.writeHead(200, {
'Content-Type': 'image/gif'
});
res.end(img, 'binary');
});
});
});
}).listen(1337, '127.0.0.1', function(err){
if(err){
console.log("Failed to start web server:", err);
}else{
console.log('Server running at http://127.0.0.1:1337/');
}
});
var download = function(uri, filename, callback) {
request.head(uri, function(err, res, body) {
console.log('content-type:', res.headers['content-type']);
request(uri).pipe(fs.createWriteStream(filename)).on('close', callback);
});
};
function getDateTime() {
var date = new Date();
var year = date.getFullYear();
var month = date.getMonth() + 1;
month = (month < 10 ? "0" : "") + month;
var day = date.getDate();
day = (day < 10 ? "0" : "") + day;
return year + "-" + month + "-" + day ;
}
注意:我通过执行以下修复稍微清理了您的代码: 1) 你两次设置请求变量,所以我删除了第二个。 2) 每次服务器收到请求时,您都打印出 'Server running..' 字符串,所以我在服务器启动时打印出来,没有出现错误。
欢迎来到Node.JS!