2012-05-05 40 views
11

Tôi đang sử dụng nút và tốc độ. Để đăng ký một bộ điều khiển tôi gọi:Mẫu URI: Có thực thi rfc-6570 trong javascript không?

app.get('/user/:id', function (req, res) {...}); 

Nhưng tôi muốn làm điều đó một rfc-6570 cách:

app.get('/user/{id}', function (req, res) {...}); 

Tôi googled chỉ là một thực hiện trong python trên google mã, nhưng không tìm thấy gì cả (trừ người chết liên kết trên mã google để http://www.snellspace.com/wp/?p=831) cho JavaScript.

URI templating nói chung không phải là quá dễ dàng như nó nhìn vào cái nhìn đầu tiên. Có một cái nhìn về các ví dụ trong RFC.

PS: Tôi cũng sẽ cần các mẫu URI trên máy khách.

+0

Đó RFC là chỉ có hai tháng tuổi; Tôi sẽ không ngạc nhiên nếu không có bất kỳ triển khai tuân thủ nào trong một thời gian ... – maerics

+0

Vì tò mò, tại sao bạn muốn sử dụng RFC thay vì biểu mẫu mà Express cung cấp? – maerics

+0

Đầu tiên, rfc chỉ có 2 tháng tuổi. Nhưng các bản nháp này được khoảng 3 tuổi. – afx

Trả lời

7

Tôi đã dọn dẹp danh sách triển khai tại http://code.google.com/p/uri-templates/wiki/Implementations - có mã JS ở số https://github.com/marc-portier/uri-templates nhưng tôi không chắc liệu nó có thực hiện RFC hay chất lượng của nó.

Lưu ý rằng chúng tôi đã bắt đầu kiểm tra xuất bản ở đây: https://github.com/uri-templates/uritemplate-test

Vì vậy, nếu bạn muốn kiểm tra xem nó, bạn có thể bắt đầu ở đó.

+0

Cảm ơn bạn! Tôi sẽ tích hợp các bài kiểm tra khi thực hiện. Công việc của marc portier là tốt, nhưng nó chỉ có thể phân tích cú pháp một mẫu và mở rộng nó thành một URI. Nhưng phần khó khăn là trích xuất các biến của một URI đã cho bằng một uriTemplate. Như bạn đã viết trong đoạn cuối của 1.5 trong rfc: "Một số mẫu URI có thể được sử dụng ngược lại với mục đích biến đổi : so sánh mẫu với URI được tạo thành đầy đủ để trích xuất các phần biến từ URI đó và chỉ định chúng cho các biến có tên là . " – afx

+0

@afx Bạn đã triển khai nó ở đâu đó chưa? Tôi muốn làm điều tương tự và sẽ phải tạo ra một, bất cứ nơi nào tôi có thể tham gia? – Almad

+0

@afx Xin lỗi, bằng cách nào đó đã bỏ lỡ rằng bạn có lẽ là fxa từ github;) – Almad

4

Tính đến tháng 6 năm 2014, các triển khai JavaScript này có vẻ hoàn thiện nhất (Cấp 4 của thông số kỹ thuật) và tested. Cả ba cũng hỗ trợ cả trình duyệt và node.js.

0

Về router phần nhanh Tôi muốn giới thiệu để sử dụng các mẫu uri của bạn trong một số hyperschema (read more) ...

Sau đó, bạn cũng có thể hưởng lợi từ regex cho bộ định tuyến của bạn mà express.js hỗ trợ. Về giải quyết các thông số bạn cần một RFC 6570 thực hiện như https://github.com/geraintluff/uri-templates ...

Dưới đây là một số mã .js để minh họa cho viết lại của một hyperschema SỬ DỤNG RFC 6570 để chuyển nó sang định tuyến một nhanh js:

var hyperschema = { 
    "$schema": "http://json-schema.org/draft-04/hyper-schema", 
    "links": [ 
    { 
     "href": "{/id}{/ooo*}{#q}", 
     "method": "GET", 
     "rel": "self", 
     "schema": { 
     "type": "object", 
     "properties": { 
      "params": { 
      "type": "object", 
      "properties": { 
       "id": {"$ref": "#/definitions/id"} 
      }, 
      "additionalProperties": false 
      } 
     }, 
     "additionalProperties": true 
     } 
    } 
    ], 
    "definitions": { 
    "id": { 
     "type": "string", 
     "pattern": "[a-z]{0,3}" 
    } 
    } 
} 
var deref = require('json-schema-deref'); 
    var tv4 = require('tv4'); 
    var url = require('url'); 
    var rql = require('rql/parser'); 

// DOJO lang AND _ 
function getDottedProperty(object, parts, create) { 
    var key; 
    var i = 0; 

    while (object && (key = parts[i++])) { 
     if (typeof object !== 'object') { 
      return undefined; 
     } 
     object = key in object ? object[key] : (create ? object[key] = {} : undefined); 
    } 

    return object; 
} 
function getProperty(object, propertyName, create) { 
    return getDottedProperty(object, propertyName.split('.'), create); 
} 
function _rEscape(str) { 
    return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); 
} 

function getPattern(k, ldo, customCat) { 
    // ...* = explode = array 
    // ...: = maxLength 
    var key = ((k.slice(-1) === '*') ? k.slice(0,-1) : k).split(':')[0]; 
    var cat = (customCat) ? customCat : 'params'; // becomes default of customCat in TS 
    var pattern = ''; 
    if (typeof ldo === 'object' && ldo.hasOwnProperty('schema')) { 
    var res = getProperty(ldo.schema, ['properties',cat,'properties',key,'pattern'].join('.')); 
    if (res) { 
     console.log(['properties',cat,'properties',key,'pattern'].join('.'),res); 
     return ['(',res,')'].join(''); 
    } 
    } 
    return pattern; 
} 
function ldoToRouter(ldo) { 
    var expression = ldo.href.replace(/(\{\+)/g, '{') // encoding 
    .replace(/(\{\?.*\})/g, '') // query 
    .replace(/\{[#]([^}]*)\}/g, function(_, arg) { 
     // crosshatch 
     //console.log(arg); 
     return ['(?:[/]*)?#:',arg,getPattern(arg,ldo,'anchor')].join(''); 
    }) 
    .replace(/\{([./])?([^}]*)\}/g, function(_, op, arg) { 
     // path seperator 
     //console.log(op, '::', arg, '::', ldo.schema); 
     return [op,':',arg,getPattern(arg,ldo)].join(''); 
    }); 
    return {method: ldo.method.toLowerCase(), args:[expression]}; 
} 

deref(hyperschema, function(err, fullSchema) { 
    console.log('deref hyperschema:',JSON.stringify(fullSchema)); 
    var router = fullSchema.links.map(ldoToRouter); 

    console.log('router:',JSON.stringify(router)); 
}); 
Các vấn đề liên quan