【问题标题】:Send parameters from jade to js/node从jade发送参数到js/node
【发布时间】:2015-11-10 01:45:07
【问题描述】:

我正在尝试将变量从传单/玉传递到 js/node 文件。 我正在使用节点 + 快递 + 传单 + js 我正在按照以下方式进行操作,但我没有得到这些值。 这是我正在使用的代码:

app.js

var express = require('express');
var routes = require('./routes');
var tiles = require('./routes/tiles');
var http = require('http');
var path = require('path');
var app = express();
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.json());
app.use(express.urlencoded());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}

app.get('/', routes.index);
app.get('/tiles', tiles.tiles);

http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

index.js //渲染index.jade文件的索引文件

exports.index = function(req, res){
  res.render('index');
};

index.jade //jade文件,我发送参数的行是“tiles?z={z}&x={x}&y={y}”

doctype html
html
  head
    title Tile Server Example
    meta(charset='utf-8')
    meta(name='viewport', content='width=device-width, initial-scale=1.0')
    link(rel='stylesheet', href='http://cdn.leafletjs.com/leaflet-0.7.1/leaflet.css')
  body
     #map(style='width: 800px; height: 800px')
     a(href='tiles') < tiles >
    script(src='http://cdn.leafletjs.com/leaflet-0.7.1/leaflet.js')
  script.
    var map;
    var mbTiles = new L.tileLayer('tiles?z={z}&x={x}&y={y}', {
    tms: true,
    attribution: 'this is a test',
    opacity: 0.7
    });
    map = new L.Map("map",{
    zoom: 18,
    center: [12.83563,77.68312],
    layers: [mbTiles]
    }); 

tiles.js //这里是我获取参数的地方,我通过控制台显示它们

 var x = "", y = "", z = "";

module.exports = function(req, res){    
    x = req.query.x; 
    y = req.query.y;
    z = req.query.z;    

    console.log("z="+z+"&x="+x+"&y="+y);

    var sqlite3 = require('sqlite3').verbose();
    var db = new sqlite3.Database('routes/tiles.mbtiles');
    var sql = "SELECT * FROM tiles WHERE zoom_level = "+z+" AND tile_column = "+x+" AND tile_row = "+y;

    db.each(sql, function(err, row) {
            console.log(sql);
            res.writeHead(200, {'content-type':'image/jpg'});
            res.write(row.tile_data);
            res.end();
    }); 
    db.close();
};

有什么想法吗?

【问题讨论】:

  • 记录值时是否在控制台中显示?
  • 你通过控制台得到这个:GET /tiles?z=16&x=46910&y=35126 - - ms - -
  • 嗯,这只是有关请求的信息。我的意思是,这个声明:console.log("x--&gt;"+x); 记录什么吗?还是永远达不到?

标签: javascript node.js express leaflet


【解决方案1】:

尝试改变导出模块的方式。在tiles.js:

变化:

exports.tiles = function(req, res){ ...

收件人:

module.exports = function(req, res){ 

app.js:

app.get('/tiles', tiles.tiles)

app.get('/tiles', tiles)

更新

此外,在设置标头和所需信息后添加res.end() 以将响应更改为完成状态。

res.writeHead(200, {'content-type':'image/png'});
res.write(row.tile_data);
res.end();

【讨论】:

  • 我做了更改,现在加载图像,但是,第一次加载页面,图像不显示(日志:GET / 200 394.741 ms - 619),一分钟后,页面发送参数并加载图像(日志;GET /tiles?z=16&x=46909&y=35123 200 120005.811 ms - -)
  • 哦,120005.811 ms 确实太长了。我认为问题出在mysql查询中。您可以将它记录到控制台,复制它并从 mysql cli 或某些客户端运行它吗?是否需要相同的时间?
  • db 是 sqlite3(文件重命名为 .mbtiles 并按缩放级别、平铺列和平铺行进行索引)。我在 SQLiteStudio 中运行查询并花费了 0.000 秒。
  • 哦,我错过了它是 sqlite,抱歉。一会儿,我会考虑一下这个问题。
  • 太棒了!现在完美!我已经更新了原始代码,现在它完全可以使用了,所以如果有人需要它,他们可以拿走它并使用它。脱帽致敬,给你五颗星,我的朋友!非常感谢您的时间和帮助! s11.postimg.org/xdfte8eib/tiles_ok.png
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-31
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2020-04-11
  • 2016-01-13
相关资源
最近更新 更多