Warum erhalte ich einen Fehler beim Ausführen des unten gezeigten Codes? (Es ist in einer der Hausaufgaben in der Stanford 'Startup Engineering' Kurs auf Coursera verwendet:Warum bekomme ich "TypeError: Objekt ist keine Funktion" dieses Beispiel node.js Code ausgeführt?
Der Kurs lief im Juni-September 2013, so gab es möglicherweise Updates für Knoten oder CSV, die das Skript gebrochen haben, vielleicht? Bei den Hausaufgaben geht es nicht darum, das Skript zu reparieren, also ist diese Frage kein "Cheat" und der Kurs läuft momentan sowieso nicht.
Also, die Umgebung ist: Ubuntu 14.04 (Kernel 3-13-0- 29-generic), Knoten v0.11.13, npm v1.4.9
und ich habe npm install
‚d csv, Buchhaltung util und restler im Home-Verzeichnis, und das Skript gibt es auch.
Das hat mich völlig ratlos .... :-(
Fehlermeldung:
[[email protected]:~]$node market-research.js
Invoked at command line.
Wrote market-research.csv
Symbol Name Market Cap Previous Close Price P/E Ratio Shares EPS Earnings
/home/ubuntu/market-research.js:47
csv()
^
TypeError: object is not a function
at csv2console (/home/ubuntu/market-research.js:47:5)
at Request.response2console (/home/ubuntu/market-research.js:65:13)
at Request.EventEmitter.emit (events.js:110:17)
at Request.mixin._fireSuccess (/home/ubuntu/node_modules/restler/lib/restler.js:226:10)
at /home/ubuntu/node_modules/restler/lib/restler.js:158:20
at IncomingMessage.parsers.auto (/home/ubuntu/node_modules/restler/lib/restler.js:394:7)
at Request.mixin._encode (/home/ubuntu/node_modules/restler/lib/restler.js:195:29)
at /home/ubuntu/node_modules/restler/lib/restler.js:154:16
at Request.mixin._decode (/home/ubuntu/node_modules/restler/lib/restler.js:170:7)
at IncomingMessage.<anonymous> (/home/ubuntu/node_modules/restler/lib/restler.js:147:14)
[[email protected]:~]$
Code:
#!/usr/bin/env node
/*
Use the Yahoo Finance CSV API to do some basic market research calculations.
- Background: http://greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api/
- Example URL: http://finance.yahoo.com/d/quotes.csv?s=GOOG+FB+AAPL&f=snj1pr
s: Symbol
n: Name
j1: Market Capitalization (in billions)
p: Price-per-share (at previous close)
r: Price to Earnings Ratio
Further references.
- https://github.com/danwrong/restler
- https://github.com/wdavidw/node-csv
- http://josscrowcroft.github.io/accounting.js
- http://stackoverflow.com/questions/4981891/node-js-equivalent-of-pythons-if-name-main
- http://nodejs.org/docs/latest/api/util.html#util_util_format_format
*/
var util = require('util');
var fs = require('fs');
var rest = require('restler');
var csv = require('csv');
var accounting = require('accounting');
var CSVFILE_DEFAULT = "market-research.csv";
var SYMBOLS_DEFAULT = ["GOOG", "FB", "AAPL", "YHOO", "MSFT", "LNKD", "CRM"];
var COLUMNS_DEFAULT = 'snj1pr'; // http://greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api
var HEADERS_DEFAULT = ["Symbol", "Name", "Market Cap", "Previous Close Price",
"P/E Ratio", "Shares", "EPS", "Earnings"];
var financeurl = function(symbols, columns) {
return util.format(
'http://finance.yahoo.com/d/quotes.csv?s=%s&f=%s',
symbols.join('+'),
columns);
};
var marketCapFloat = function(marketCapString) {
return parseFloat(marketCapString.split('B')[0]) * 1e9;
};
var csv2console = function(csvfile, headers) {
console.log(headers.join("\t"));
csv()
.from.path(csvfile)
.on('record', function(row, index) {
var shares = Math.round(marketCapFloat(row[2])/row[3], 0);
var eps = (row[3]/row[4]).toFixed(3);
var earnings = accounting.formatMoney(eps * shares);
outrow = row.concat([shares, eps, earnings]);
console.log(outrow.join("\t"));
});
};
var buildfn = function(csvfile, headers) {
var response2console = function(result, response) {
if (result instanceof Error) {
console.error('Error: ' + util.format(response.message));
} else {
console.error("Wrote %s", csvfile);
fs.writeFileSync(csvfile, result);
csv2console(csvfile, headers);
}
};
return response2console;
};
var marketResearch = function(symbols, columns, csvfile, headers) {
symbols = symbols || SYMBOLS_DEFAULT;
columns = columns || COLUMNS_DEFAULT;
csvfile = csvfile || CSVFILE_DEFAULT;
headers = headers || HEADERS_DEFAULT;
var apiurl = financeurl(symbols, columns);
var response2console = buildfn(csvfile, headers);
rest.get(apiurl).on('complete', response2console);
};
if(require.main == module) {
console.error('Invoked at command line.');
var symbols = process.argv;
if(symbols.length > 2) {
symbols = symbols.slice(2, symbols.length);
} else {
symbols = undefined;
};
marketResearch(symbols);
} else {
console.error('Invoked via library call');
}
exports.marketResearch = marketResearch;
Inhalt markt research.csv vom Skript erstellt :
"GOOG","Google Inc.",386.6B,569.20,29.49
"FB","Facebook, Inc.",194.5B,73.855,78.49
"AAPL","Apple Inc.",613.8B,102.25,16.49
"YHOO","Yahoo! Inc.",38.302B,38.31,33.11
"MSFT","Microsoft Corpora",374.3B,44.88,17.06
"LNKD","LinkedIn Corporat",27.747B,223.26,N/A
"CRM","Salesforce.com In",36.577B,58.29,N/A
wird Modul csv? Welche Version verwendest du und wo verwendest du? haben Sie versucht, die csv var vor der Verwendung zu protokollieren? – matteospampani
Sind Sie sicher, dass Sie die richtige Version verwenden? Die API der aktuellen Version scheint sich von der Ihres Codes zu unterscheiden. –
Ich denke, CSV ist keine Funktion. csv ist ein Objekt und seine Exponierungsfunktionen csv.generate, csv.parse, csv.transform, csv.stringify; so kann man nur eine dieser Funktionen verwenden ... – balaphp