2014-09-01 4 views
7

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 
+0

wird Modul csv? Welche Version verwendest du und wo verwendest du? haben Sie versucht, die csv var vor der Verwendung zu protokollieren? – matteospampani

+1

Sind Sie sicher, dass Sie die richtige Version verwenden? Die API der aktuellen Version scheint sich von der Ihres Codes zu unterscheiden. –

+0

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

Antwort

7

Qua ntas 94 Heavy, danke für den Hinweis.

Vor 12 Monaten war node-csv bei Version 0.2, aber jetzt ist es bei 0.4 und die API hat sich geändert.

geschrieben habe ich jetzt die csv-Konsole funktionieren wie folgt:

korrekt installiert
// part of file market-script.js 
// edited by Jeff Moye (Moyesoft) 
// no attribution in the original file 

var csv2console = function(csvfile, headers) { 
    console.log(headers.join("\t")); 
    var parser = csv.parse(); //create the parser                            

    parser.on('readable', function(){ //the 'record' event no longer exists                     
             // so instead we write a handler for the                    
             // 'readable' event                          
    while(record = parser.read()){  // and read() each record in a loop                             
     var shares = Math.round(marketCapFloat(record[2])/record[3], 0); 
     var eps = (record[3]/record[4]).toFixed(3); 
     var earnings = accounting.formatMoney(eps * shares); 
     outrow = record.concat([shares, eps, earnings]); 
     console.log(outrow.join("\t")); 
    } 
    }); 

    parser.on('error', function(err){ // we may as well have an error handler                     
    console.log(err.message); 
    }); 

    fs.createReadStream(csvfile).pipe(parser); //open file as a stream and pipe it to the parser                
}; 
+1

Danke! Das hätte ich nie alleine herausgefunden. – Mike

+0

Ich bekomme nach der Endausgabe schreiben, wie löse ich es? – mithra

Verwandte Themen