如何在node.js服务器上加载图像?

时间:2015-07-27 17:18:12

标签: javascript node.js cheerio

我想在node.js文件中加载图像。但是,当我尝试fs.readfile时,如果服务器运行后没有图像文件,则会出错。但是,当我启动我的服务器时,图像会被下载并显示并正常工作。

当我保持服务器运行并删除图像并尝试刷新页面时,希望图像将被重载并显示静止,它会在fs.read文件上出错,因为图像文件不存在,因为它不会重新下载它被删除了。

如何使网页动态,所以当我刷新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很新,所以请耐心等待。

1 个答案:

答案 0 :(得分:3)

您的代码现在的问题是您正在下载所谓的全局范围中的图片,因此当Node.JS加载文件并读取所有代码时,它会看到该函数并且只运行一个时间。要做你想要完成的事情(让服务器每次下载图片)你必须将下载功能放在Web服务器收到请求时执行的函数内,如下所示:

    controller: function($scope, $http) { //<-- added dependency here
        $http.get('assets/js/components.json')
            .then(function(result) {
                $scope.patterns = result.data;
        });
    },

注意:我通过执行以下修复程序稍微清理了一下代码: 1)您正在设置请求变量两次,所以我删除了第二个。 2)每次服务器收到请求时,你都打印出'Server running ..'字符串,所以我在服务器启动时打印出来没有错误。

欢迎使用Node.JS!