Route.get() requires callbackrational functionss but got a [object Undefined]

114网址导航javascript - Error: .get() requires callback functions but got a [object Undefined] - Stack Overflow
to customize your list.
Join the Stack Overflow Community
Stack Overflow is a community of 4.7 million programmers, just like you, helping each other.
J it only takes a minute:
I am new to node & express and I tried different variations and couldn't figure out why.
If I map app.get ('/') to just contentHandler then it works fine.
But if I map app.get ('/) to contentHandler.displayWelcomePage then I get the above error.
Thanks for looking.
Here is my structure:
routes/index.js
routes/content.js
var express = require('express')
app = express()
routes = require('./routes')
http = require('http')
path = require('path')
mongoose = require ('mongoose')
db = mongoose.connection
db.on ('error', console.error);
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
app.use (app.router);
routes(app, db);
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
routes/index.js
var contentHandler = require('./content');
//this is what I need to add, see my notes below var aHandler = new contentHandler();
module.exports = exports = function (app, db) {
console.log ('inside routes/index.js');
app.get ('/', contentHandler.displayWelcomePage);
//instead of using contentHandler, use aHandler.displayWelcomePage
routes/content.js
function contentHandler (req, res, db) {
console.log ('Inside contentHandler');
res.render('index', {layout: false, title: "Jade is three."});
this.displayWelcomePage = function (req, res) {
return res.render('index', {layout: false, title: "Welcome to Jade"});
module.exports = contentH
Know someone who can answer?
Share a link to this
via , , , or .
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Browse other questions tagged
Stack Overflow works best with JavaScript enabled第1题["1", "2", "3"].map(parseInt)知识点:Array/mapNumber/parseIntJavaScript parseInt首先, map接受两个参数, 一个回调函数 callback, 一个回调函数的this值其中回调函数接受三个参数 currentValue, index,而题目中, map只传入了回调函数--parseInt.其次, parseInt 只接受两个两个参数 string, radix(基数).可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 &0x& 或 &0X& 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。所以本题即问parseInt('1', 0);parseInt('2', 1);parseInt('3', 2);首先后两者参数不合法.所以答案是&[1, NaN, NaN]第2题[typeof null, null instanceof Object]两个知识点:Operators/typeofOperators/instanceofOperators/instanceof(中)typeof 返回一个表示类型的字符串.instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上.这个题可以直接看链接... 因为&typeof null === 'object'&自语言之初就是这样....typeof 的结果请看下表:type
resultUndefined
"undefined"Null
"object"Boolean
"boolean"Number
"number"String
"string"Symbol
"symbol"Host object Implementation-dependentFunction
"function"Object
"object"所以答案&[object, false]第3题[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ]知识点:Array/Reducearr.reduce(callback[, initialValue])reduce接受两个参数, 一个回调, 一个初始值.回调函数接受四个参数&previousValue, currentValue, currentIndex, array需要注意的是&If the array is empty and no initialValue was provided, TypeError would be thrown.所以第二个表达式会报异常. 第一个表达式等价于&Math.pow(3, 2) =& 9; Math.pow(9, 1) =&9答案&an error第4题var val = 'smtg';console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');两个知识点:Operators/Operator_PrecedenceOperators/Conditional_Operator简而言之&+&的优先级 大于&?所以原题等价于&'Value is true' ? 'Somthing' : 'Nonthing'&而不是&'Value is' + (true ? 'Something' : 'Nonthing')答案&'Something'第5题var name = 'World!';(function () {
if (typeof name === 'undefined') {
var name = 'Jack';
console.log('Goodbye ' + name);
console.log('Hello ' + name);
}})();这个相对简单, 一个知识点:Hoisting在 JavaScript中, functions 和 variables 会被提升。变量提升是JavaScript将声明移至作用域 scope (全局域或者当前函数作用域) 顶部的行为。这个题目相当于var name = 'World!';(function () {
if (typeof name === 'undefined') {
name = 'Jack';
console.log('Goodbye ' + name);
console.log('Hello ' + name);
}})();所以答案是&'Goodbye Jack'第6题var END = Math.pow(2, 53);var START = END - 100;var count = 0;for (var i = START; i &= END; i++) {
count++;}console.log(count);一个知识点:Infinity在 JS 里, Math.pow(2, 53) == 0992 是可以表示的最大值. 最大值加一还是最大值. 所以循环不会停.第7题var ary = [0,1,2];ary[10] = 10;ary.filter(function(x) { return x ===});答案是&[]看一篇文章理解稀疏数组译 JavaScript中的稀疏数组与密集数组Array/filter我们来看一下 Array.prototype.filter 的 polyfill:if (!Array.prototype.filter) { Array.prototype.filter = function(fun/*, thisArg*/) {
'use strict';
if (this === void 0 || this === null) {
throw new TypeError();
var t = Object(this);
var len = t.length &&& 0;
if (typeof fun !== 'function') {
throw new TypeError();
var res = [];
var thisArg = arguments.length &= 2 ? arguments[1] : void 0;
for (var i = 0; i & i++) {
if (i in t) { // 注意这里!!!
var val = t[i];
if (fun.call(thisArg, val, i, t)) {
res.push(val);
} };}我们看到在迭代这个数组的时候, 首先检查了这个索引值是不是数组的一个属性, 那么我们测试一下.0 =& true3 =& false10 =& true也就是说 从 3 - 9 都是没有初始化的'坑'!, 这些索引并不存在与数组中. 在 array 的函数调用的时候是会跳过这些'坑'的.第8题var two
= 0.2var one
= 0.1var eight = 0.8var six
= 0.6[two - one == one, eight - six == two]JavaScript的设计缺陷?浮点运算:0.1 + 0.2 != 0.3IEEE 754标准中的浮点数并不能精确地表达小数那什么时候精准, 什么时候不经准呢? 笔者也不知道...答案&[true, false]第9题function showCase(value) {
switch(value) {
console.log('Case A');
console.log('Case B');
case undefined:
console.log('undefined');
console.log('Do not know!');
}}showCase(new String('A'));两个知识点:Statements/switchStringswitch 是严格比较, String 实例和 字符串不一样.var s_prim = 'foo';var s_obj = new String(s_prim);console.log(typeof s_prim); // "string"console.log(typeof s_obj); // "object"console.log(s_prim === s_obj); // false答案是&'Do not know!'第10题function showCase2(value) {
switch(value) {
console.log('Case A');
console.log('Case B');
case undefined:
console.log('undefined');
console.log('Do not know!');
}}showCase2(String('A'));解释:String(x) does not create an object but does return a string, i.e. typeof String(1) === "string"还是刚才的知识点, 只不过 String 不仅是个构造函数 直接调用返回一个字符串哦.答案&'Case A'第11题function isOdd(num) {
return num % 2 == 1;}function isEven(num) {
return num % 2 == 0;}function isSane(num) {
return isEven(num) || isOdd(num);}var values = [7, 4, '13', -9, Infinity];values.map(isSane);一个知识点Arithmetic_Operators#Remainder此题等价于7 % 2 =& 14 % 2 =& 0'13' % 2 =& 1-9 % % 2 =& -1Infinity % 2 =& NaN需要注意的是 余数的正负号随第一个操作数.答案&[true, true, true, false, false]第12题parseInt(3, 8)parseInt(3, 2)parseInt(3, 0)第一个题讲过了, 答案&3, NaN, 3第13题Array.isArray( Array.prototype )一个知识点:Array/prototype一个鲜为人知的实事:&Array.prototype =& [];答案:&true第14题var a = [0];if ([0]) { console.log(a == true);} else { console.log("wut");}JavaScript-Equality-Table答案:&false第15题[]==[]==&是万恶之源, 看上图答案是&false第16题'5' + 3'5' - 3两个知识点:Arithmetic_Operators#AdditionArithmetic_Operators#Subtraction+&用来表示两个数的和或者字符串拼接,&-表示两数之差.请看例子, 体会区别:& '5' + 3'53'& 5 + '3''53'& 5 - '3'2& '5' - 32& '5' - '3'2也就是说&-&会尽可能的将两个操作数变成数字, 而&+&如果两边不都是数字, 那么就是字符串拼接.答案是&'53', 2第17题1 + - + + + - + 1这里应该是(倒着看)1 + (a) =& 2a = - (b) =& 1b = + (c) =& -1c = + (d) =& -1d = + (e) =& -1e = + (f) =& -1f = - (g) =& -1g = + 1
=& 1所以答案&2第18题var ary = Array(3);ary[0]=2ary.map(function(elem) { return '1'; });稀疏数组. 同第7题.题目中的数组其实是一个长度为3, 但是没有内容的数组, array 上的操作会跳过这些未初始化的'坑'.所以答案是&["1", undefined & 2]这里贴上 Array.prototype.map 的 polyfill.Array.prototype.map = function(callback, thisArg) {
if (this == null) {
throw new TypeError(' this is null or not defined');
var O = Object(this);
var len = O.length &&& 0;
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function');
if (arguments.length & 1) {
A = new Array(len);
while (k & len) {
var kValue, mappedV
if (k in O) {
kValue = O[k];
mappedValue = callback.call(T, kValue, k, O);
A[k] = mappedV
};第19题function sidEffecting(ary) { ary[0] = ary[2];}function bar(a,b,c) { c = 10 sidEffecting(arguments); return a + b +}bar(1,1,1)这是一个大坑, 尤其是涉及到 ES6语法的时候知识点:Functions/arguments首先&The arguments object is an Array-like object corresponding to the arguments passed to a function.也就是说&arguments&是一个&object, c 就是 arguments[2], 所以对于 c 的修改就是对 arguments[2] 的修改.所以答案是&21.然而!!!!!!当函数参数涉及到&any rest parameters, any default parameters or any destructured parameters&的时候, 这个 arguments 就不在是一个&mapped arguments object&了.....请看:function sidEffecting(ary) { ary[0] = ary[2];}function bar(a,b,c=3) { c = 10 sidEffecting(arguments); return a + b +}bar(1,1,1)答案是&12&!!!!请读者细细体会!!第20题var a = ,
b = 1111;a +答案还是&. 解释是&Lack of precision for numbers in JavaScript affects both small and big numbers.&但是笔者不是很明白................ 请读者赐教!第21题var x = [].x();这个题有意思!知识点:Array/reverseThe reverse method transposes the elements of the calling array object in place, mutating the array, and returning a reference to the array.也就是说 最后会返回这个调用者(this), 可是 x 执行的时候是上下文是全局. 那么最后返回的是&window.答案是&window第22题Number.MIN_VALUE & 0true&今天先到这里, 下次我们来看后22个题!第23题[1 & 2 & 3, 3 & 2 & 1]这个题也还可以.这个题会让人误以为是&2 & 1 && 2 & 3&其实不是的.这个题等价于 1 & 2 =& true & 3 =& 1 & 3 =& 3 & 2 =& false & 1 =& 0 & 1 =&答案是&[true, true]第24题// the most classic wtf2 == [[[2]]]这个题我是猜的. 我猜的&true, 至于为什么.....both objects get converted to strings and in both cases the resulting string is "2"&我不能信服...第25题3.toString()3..toString()3...toString()这个题也挺逗, 我做对了 :) 答案是&error, '3', error你如果换一个写法就更费解了var a = 3;a.toString()这个答案就是&'3';为啥呢?因为在 js 中&1.1,&1.,&.1&都是合法的数字. 那么在解析&3.toString&的时候这个&.&到底是属于这个数字还是函数调用呢? 只能是数字, 因为3.合法啊!第26题(function(){ var x = y = 1;})();console.log(y);console.log(x);答案是&1, errory 被赋值到全局. x 是局部变量. 所以打印 x 的时候会报&ReferenceError第27题var a = /123/,
b = /123/;a == ba === b即使正则的字面量一致, 他们也不相等.答案&false, false第28题var a = [1, 2, 3],
b = [1, 2, 3],
c = [1, 2, 4]a == ba === ba &
c字面量相等的数组也不相等.数组在比较大小的时候按照字典序比较答案&false, false, false, true第29题var a = {}, b = Object.[a.prototype === b, Object.getPrototypeOf(a) === b]知识点:Object/getPrototypeOf只有 Function 拥有一个 prototype 的属性. 所以&a.prototype&为&undefined.而&Object.getPrototypeOf(obj)&返回一个具体对象的原型(该对象的内部[[prototype]]值)答案&false, true第30题function f() {}var a = f.prototype, b = Object.getPrototypeOf(f);a === bf.prototype is the object that will become the parent of any objects created with new f while Object.getPrototypeOf returns the parent in the inheritance hierarchy.f.prototype 是使用使用 new 创建的 f 实例的原型. 而 Object.getPrototypeOf 是 f 函数的原型.请看:a === Object.getPrototypeOf(new f()) // trueb === Function.prototype // true答案&false31function foo() { }var oldName = foo.foo.name = "bar";[oldName, foo.name]答案&['foo', 'foo']知识点:Function/name因为函数的名字不可变.第32题"1 2 3".replace(/\d/g, parseInt)知识点:String/replace#Specifying_a_function_as_a_parameterstr.replace(regexp|substr, newSubStr|function)如果replace函数传入的第二个参数是函数, 那么这个函数将接受如下参数match 首先是匹配的字符串p1, p2 .... 然后是正则的分组offset match 匹配的indexstring 整个字符串由于题目中的正则没有分组, 所以等价于问parseInt('1', 0)parseInt('2', 2)parseInt('3', 4)答案:&1, NaN, 3第33题function f() {}var parent = Object.getPrototypeOf(f);f.name // ?parent.name // ?typeof eval(f.name) // ?typeof eval(parent.name) // ?先说以下答案&'f', 'Empty', 'function', error&这个答案并不重要.....这里第一小问和第三小问很简单不解释了.第二小问笔者在自己的浏览器测试的时候是&'', 第四问是&'undefined'所以应该是平台相关的. 这里明白&parent === Function.prototype&就好了.第34题var lowerCaseOnly = /^[a-z]+$/;[lowerCaseOnly.test(null), lowerCaseOnly.test()]知识点:RegExp/test这里 test 函数会将参数转为字符串.&'nul',&'undefined'&自然都是全小写了答案:&true, true第35题[,,,].join(", ")[,,,] =& [undefined & 3]因为javascript 在定义数组的时候允许最后一个元素后跟一个,, 所以这是个长度为三的稀疏数组(这是长度为三, 并没有 0, 1, 2三个属性哦)答案:&", , "第36题var a = {class: "Animal", name: 'Fido'};a.class这个题比较流氓.. 因为是浏览器相关,&class是个保留字(现在是个关键字了)所以答案不重要, 重要的是自己在取属性名称的时候尽量避免保留字. 如果使用的话请加引号&a['class']第37题var a = new Date("epoch")知识点:DateDate/parse简单来说, 如果调用 Date 的构造函数传入一个字符串的话需要符合规范, 即满足 Date.parse 的条件.另外需要注意的是 如果格式错误 构造函数返回的仍是一个Date 的实例&Invalid Date.答案&Invalid Date第38题var a = Function.length,
b = new Function().lengtha === b我们知道一个function(Function 的实例)的&length&属性就是函数签名的参数个数, 所以 b.length == 0.另外 Function.length 定义为1......所以不相等.......答案&false第39题var a = Date(0);var b = new Date(0);var c = new Date();[a === b, b === c, a === c]还是关于Date 的题, 需要注意的是如果不传参数等价于当前时间.如果是函数调用 返回一个字符串.答案&false, false, false第40题var min = Math.min(), max = Math.max()min & max知识点:Math/minMath/max有趣的是, Math.min 不传参数返回&Infinity, Math.max 不传参数返回&-Infinity&答案:&false第41题function captureOne(re, str) { var match = re.exec(str); return match && match[1];}var numRe = /num=(\d+)/ig,
wordRe = /word=(\w+)/i,
a1 = captureOne(numRe, "num=1"),
a2 = captureOne(wordRe, "word=1"),
a3 = captureOne(numRe, "NUM=2"),
a4 = captureOne(wordRe, "WORD=2");[a1 === a2, a3 === a4]知识点:RegExp/exec通俗的讲因为第一个正则有一个 g 选项 它会&记忆&他所匹配的内容, 等匹配后他会从上次匹配的索引继续, 而第二个正则不会举个例子var myRe = /ab*/g;var str = 'abbcdefabh';var myAwhile ((myArray = myRe.exec(str)) !== null) { var msg = 'Found ' + myArray[0] + '. '; msg += 'Next match starts at ' + myRe.lastI console.log(msg);}// Found abb. Next match starts at 3// Found ab. Next match starts at 9所以 a1 = '1'; a2 = '1'; a3 = a4 = '2'答案&[true, false]第42题var a = new Date(""),
b = new Date();[a.getDay() === b.getDay(), a.getMonth() === b.getMonth()]这个....JavaScript inherits 40 years old design from C: days are 1-indexed in C's struct tm, but months are 0 indexed. In addition to that, getDay returns the 0-indexed day of the week, to get the 1-indexed day of the month you have to use getDate, which doesn't return a Date object.a.getDay()3b.getDay()6a.getMonth()2b.getMonth()3都是套路!答案&[false, false]第43题if ('/picture.jpg'.match('.gif')) { 'a gif file'} else { 'not a gif file'}知识点:String/matchString.prototype.match 接受一个正则, 如果不是, 按照&new RegExp(obj)&转化. 所以&.&并不会转义那么&/gif&就匹配了 /.gif/答案:&'a gif file'第44题function foo(a) {}function bar(a) {
var a = 'bye';}[foo('hello'), bar('hello')]在两个函数里, a作为参数其实已经声明了, 所以& var a = 'bye'&其实就是&a; a ='bye'所以答案&'hello', 'bye'全部结束!&总结由于笔者水平有限, 如果解释有误, 还望指出&通过整理, 笔者发现绝大部分题目都是因为自己对于基础知识或者说某个 API 的参数理解偏差才做错的.笔者的重灾区在原型那一块, 所以这次被虐和整理还是很有意义呀.笔者相信 坚实的基础是深入编程的前提. 所以基础书还是要常看啊&最后这些变态题现在看看还变态嘛?
、 、 、 、 、

我要回帖

更多关于 sqlfunctions 的文章

 

随机推荐