Trying to switch out Mongo and put in Postgres (in other words, similar code worked fine with Mongo). Getting Cannot read property 'length' of undefined on the following code. I'm sure it's simple but I'm new to this whole stack so having trouble tying it together. Not a lot of examples on knex, so even though the docs are pretty good, I'm having trouble finding an example to copy.
I'm obviously pulling the right data but am stuck on how to get jade to display it.
Stack: Node/Express/Knex/Postgres/Jade
users.js
router.get('/', function(req, res, next) {
db.select().from('users').limit(1)
.then(function(users) {
console.dir(users)})
.then(function(users) {
res.render('users', {users: users})})
.catch(function(error) {
console.error(error)
})
});
users.jade
extends layout
block content
h1 Users
ul
for user in users
p
input(type="text", name="name", value="#{user.name}")
input(type="text", name="admin", value="#{user.admin}")
input(type="text", name="smsNumber", value="#{user.smsNumber}")
console
[ { uid: 1,
name: 'Don',
admin: 'true',
smsNumber: '4077023951',
created_at: null,
updated_at: null } ]
browser at localhost:3000/users
C:\Users\dvande03\Personal\dailychallenge\views\users.jade:6 4| h1 Users 5| ul > 6| for user in users 7| p 8| input(type="text", name="name", value="#{user.name}") 9| input(type="text", name="admin", value="#{user.admin}") Cannot read property 'length' of undefined
TypeError: C:\Users\dvande03\Personal\dailychallenge\views\users.jade:6
4| h1 Users
5| ul
> 6| for user in users
7| p
8| input(type="text", name="name", value="#{user.name}")
9| input(type="text", name="admin", value="#{user.admin}")
Cannot read property 'length' of undefined
at eval (eval at <anonymous> (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:218:8), <anonymous>:51:31)
at eval (eval at <anonymous> (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:218:8), <anonymous>:106:4)
at eval (eval at <anonymous> (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:218:8), <anonymous>:119:22)
at res (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:219:38)
at Object.exports.renderFile (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:380:38)
at Object.exports.renderFile (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:370:21)
at View.exports.__express [as engine] (C:\Users\dvande03\Personal\dailychallenge\node_modules\jade\lib\index.js:417:11)
at View.render (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\view.js:126:8)
at tryRender (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\application.js:639:10)
at EventEmitter.render (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\application.js:591:3)
at ServerResponse.render (C:\Users\dvande03\Personal\dailychallenge\node_modules\express\lib\response.js:961:7)
at C:\Users\dvande03\Personal\dailychallenge\routes\users.js:11:13
at tryCatcher (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\util.js:24:31)
at Promise._settlePromiseFromHandler (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\promise.js:454:31)
at Promise._settlePromiseAt (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\promise.js:530:18)
at Promise._settlePromises (C:\Users\dvande03\Personal\dailychallenge\node_modules\bluebird\js\main\promise.js:646:14)
res.render should look like this: res.render(view [, locals] [, callback]), where locals is an object whose properties define local variables for the view.
In your case that means changing the line where you render to:
res.render('users', {users: users})
You pass an object with local variables to render. In the jade-file you use the keys in the object when you want to refer to the values.
Solved it but I don't completely understand why. I commented out the console.dir before the render and it works. Is that because the users in the console.dir .then didn't pass to the render .then?
I accepted the answer above too because without that, I couldn't have gotten here. Thank you #tomtom.
Related
I am getting this error I am trying to get the href to be /sendnotify/room.roomNumber.
Error: /root/13h31762/views/classmanager.jade:14
12| -var roomurl = "/sendnotify/"+ room.roomNumber;
13| li your Classes --->
> 14| a(href=roomurl, class='roomlink')#{room.roomName}
15|
16|
Unexpected token `interpolation` expected `text`, `code`, `:`, `newline` or `eos`
I have no clue why. My jade view is included below
extends layout
block content
div.container
div.row
div.col-sm-6.col-md-4.col-md-offset-4
#user
h1.text-center.login-title Welcome #{user.firstName}. Check your details below:
div.signup-wall
ul.user-details
each room in user.room
-var roomurl = "/sendnotify/"+ room.roomNumber;
li your Classes --->
a(href=roomurl, class='roomlink')#{room.roomName}
Try adding a space before your variable for roomname:
a(href=roomurl, class='roomlink') #{room.roomName}
Or since you only have the variable in the a-tag you can use:
a(href=roomurl, class='roomlink')= room.roomName
Running through this useful walkthrough for Node.js authentication with Passport, but utilising Jade templating rather than ejs. When actually running the app, the correct values are displayed in the HTML, but it annoys me that command-line jade complains. Any ideas why?
Here is the calling code:
exports.myAccount = function (req, res) {
res.render('myAccount', {
title: 'Welcome back.',
user: req.user
})
};
... and a snippet of the Jade file (myAccount.jade) :
div.row
div.col-sm-6
div.well
h3
span(class="fa fa-user")
| Local
p
strong id
| : #{user._id}
br
strong Username
| : #{user.local.username}
Finally, the error when running Jade is:
TypeError: myAccount.jade:22
20| p
21| strong id
> 22| | : #{user._id}
23| br
24| strong Username
25| | : #{user.local.username}
Cannot read property '_id' of undefined
at eval (eval at <anonymous> (..../lib/jade.js:172:8), <anonymous>:138:49)
As already mentioned, the values do actually render, so how do I get Jade to quit complaining??
adv-THANKS-ance
The short answer: provide some data on the command line so jade can properly render your string interpolation expressions such as #{user._id}.
jade --obj '{"user": {"_id": "42", "local": {"username": "bob"}}}' myAccount.jade
Explanation: Jade takes 2 things as input: some jade syntax plus some data. In your app, the data is provided by your code taking req.user, etc, so jade has what it needs to render the template to HTML. On the command line, there's no data there, so you have to provide it as I've done above.
Bonus Tip: There's more concise ways to express your template without so many pipes:
div.row
div.col-sm-6
div.well
h3
span.fa.fa-user Local
p
strong= "id: #{user._id}"
br
strong= "Username: #{user.local.username}"
I'm getting a rendering error in node.js with vash. I'm really struggling to see what the issue is. Below is the error and the code causing the error.
TypeError: Problem while rendering template at line 4, character 2.
Original message: object is not a function. Context: 2 |
#html.block('body', function(model){ 3 | <p>#model.title </p> > 4 |
}); 5 | }); 6 | 7 | at helpers.extend.model
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:2213:4)
at Object.vash.loadFile
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:2072:10)
at helpers.extend
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:2190:8)
at eval (eval at <anonymous>
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:1820:24),
<anonymous>:7:21) at vash.link.linked
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:1860:12)
at vash.renderFile
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:2082:21)
at Object.vash.loadFile
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:2070:10)
at View.vash.renderFile [as engine]
(C:\Users\user009\Dropbox\cpp\node_modules\vash\build\vash.js:2078:8)
at View.render
(C:\Users\user009\Dropbox\cpp\node_modules\express\lib\view.js:76:8)
at Function.app.render
(C:\Users\user009\Dropbox\cpp\node_modules\express\lib\application.js:502:10)
router:
app.get("/", function (request, response) {
response.render('index', {title: 'letsdoit'});
});
layout.vash
<!DOCTYPE html>
<html>
<head><link href="/css/site.css" rel="stylesheet" />
<title>#model.title</title></head>
<body><div> #html.block('body') </div></body></html>
index.vash
#html.extend('layout', function(model){
#html.block('body', function(model){
<p>#model.title </p>
});
});
In your index.vash file, make sure the path to the layout.vash file is correct.
For example, if the views folder structure is views/home/layout.vash and views/home/index.vash, then:
#html.extend('layout', function(model){
should be:
#html.extend('home/layout', function(model){
hope it helps.
This is my configuration file.
docpadConfig = {
templateData:
site:
title: 'hello docpad'
getTitle: ->
#site.title
getString: ->
'just a string'
}
# Export the DocPad Configuration
module.exports = docpadConfig
From a jade layout when I do title= site.title it renders ok. When I try to call the helper function title= getTitle() the console outputs this:
error: An error occured:
ReferenceError: /Volumes/Data/project/am/lab/docpad/hello_docpad/src/layouts/default.html.jade:21
19|
20| //- Our site title and description
> 21| title= getTitle()
22|
23| //- Output DocPad produced meta elements
24| != getBlock('meta').toHTML()
site is not defined
at docpadConfig.templateData.getWat (/Volumes/Data/project/am/lab/docpad/hello_docpad/docpad.coffee:10:16)
at eval (eval at <anonymous> (/Volumes/Data/project/am/lab/docpad/hello_docpad/node_modules/docpad-plugin-jade/node_modules/jade/lib/jade.js:170:8), <anonymous>:47:64)
Looks like I can't access the site object from inside the helper function.
I'm sure I'm missing something trivial, maybe a plugin is needed for this... can't find out "wat" is wrong here.
I've found the solution looking into a similar issue in a docpad skeleton. This relates to a bug in the Jade pre-processor.
Update to "docpad-plugin-jade": "~2.4.1" fixes the issue.
i am using backbonejs with node js trying to pass variable from backbone view to template(html file). function for rendering view template is like this :
render: function(event){
var compiled_template = _.template( $("#results-template").html() );
console.log(myPhoto.toJSON());
$(this.el).html(compiled_template(myPhoto.toJSON()));
return this;
}
myPhoto having a value :
{
src: 'placeholder.jpg',
title: 'an image placeholder',
coordinates: [0,0],
tags: ['untagged'],
location: 'home'
}
and in html file :
<script id="results-template" type="text/template">
<h2><%= title %></h2>
<p>testing....</p>
</script>
when i am execute it gives an error like
ReferenceError: c:\trello\testApp/views/test.html:19
17| <script id="results-template" type="text/template">
18|
>> 19| <h2><%= title %></h2>
20| <p>testing....</p>
21| </script>
22|
title is not defined
at Object.<anonymous> (eval at <anonymous> (c:\trello\node_modules\ejs\lib\ejs.js:203:1))
at Object.<anonymous> (c:\trello\node_modules\ejs\lib\ejs.js:201:15)
at ServerResponse._render (c:\trello\node_modules\express\lib\view.js:425:21)
at ServerResponse.render (c:\trello\node_modules\express\lib\view.js:318:17)
at c:\trello\testApp\test.js:23:16
at callbacks (c:\trello\node_modules\express\lib\router\index.js:272:11)
at param (c:\trello\node_modules\express\lib\router\index.js:246:11)
at pass (c:\trello\node_modules\express\lib\router\index.js:253:5)
at Router._dispatch (c:\trello\node_modules\express\lib\router\index.js:280:4)
at Object.handle (c:\trello\node_modules\express\lib\router\index.js:45:10)
how to solve this???
Are you sure all your photos have a title? Empty properties can cause this error. You can fix this by adding default values (empty strings for example) in your backbone Model class.