javascript - 如何在 Node.js 服务器上加载图像?

标签 javascript node.js cheerio

我想在 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)每次服务器收到请求时,您都会打印出“服务器正在运行..”字符串,因此我让它在服务器启动时打印出来,没有出现错误。

欢迎使用 Node.JS!

关于javascript - 如何在 Node.js 服务器上加载图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31659328/

相关文章:

javascript - ngbNav bootstrap Angular 选项卡的路由设置

node.js - 如何使用 NODE.JS 运行 ethereumjs

node.js - 如何根据cheerio中的文本获取元素的属性

javascript - 运行前异步不等待功能

javascript - 具有多个 View 和 Controller 实例化的 Angular ui-router 状态

javascript - 确定 JavaScript 类是否扩展了另一个类

javascript - testcafe 基于浏览器运行不同的测试

javascript - 在 NodeJS 中使用数组时“未定义不是函数”

javascript - 将 Razor 列表传递给 Javascript (JSON)

javascript - 如何正确检测 Node.js 中 JSON 对象中的转义字符?